2017-09-26 6 views
2

私は2つの変数を返すメソッドを持っているとしましょう、私はそれらの2つの戻り値を2つのリストに追加したいと思います。私は一時変数を使用する場合、それは実行可能です、よりよい方法はありますか?ただ1回の呼び出しで?Pythonで1回の呼び出しでメソッド結果を2つのリストに追加する方法は?

例えば:あなたができる

def myfunc() : 
    return "myname", "mypos" 


name_list = [] 
pos_list = [] 

# may I merge the following three lines in one call? 
name, pos = myfunc() 
name_list.append(name) 
pos_list.append(pos) 
+2

これらのリストを別々にしたい場合は、それらの値を追加するのが最良の選択です。 – poke

+1

「より良い方法」は、現在の方法が良い選択ではないと推定します。 – davidism

答えて

7

あなたのソリューションは完璧です。

the Zen of Pythonで述べたように、「読みやすカウント」、そうではなく、「最も少ない行」または「最少の変数の任意と無意味な目標を達成しようとすることに焦点を当て、「シンプルで複雑よりも優れています」中古"。それらのどちらも全く問題はありません。

確かに、これを何とか1行に入れることができます。チャンスは非常にギミック的になり、あなたが今日それを理解するかもしれない間、そして明日でも、来月、それはあなたに苦労するでしょう。

また、これを行う一般的な方法は、リスト内包表記を悪用することです。リスト内包表記は、を作成して、あなたが物事を収集するリストを作成するために使用されます。副作用のためにそれらを使用することは、より多くの行を単一行に入れるために無意味なリストを作成するので、避けるべき共通の反パターンです(もう一度読みやすさを傷つける)。


解決策は良いです。あなたの前提で、私はそれがこれら二つの別々のリストにそれらの2つの値を置くために完璧なソリューションだと言うだろう:

name, pos = myfunc() 
name_list.append(name) 
pos_list.append(pos) 

あなたは簡単に何が起こっているか理解することができます。さらに、一時変数には便利な名前があり、その関数からの複数の戻り値が何であるかを簡単に理解できます。

このリスト形式の要件がない場合は、どのような代替方法がありますか?さて、あなたのユースケースには大きく依存しますが、関数が返す同じタプルと同じリスト内の結果を収集することもできます。たぶんあなたの関数から名前付きタプルを返すので、値が何であるかというセマンティックな情報を得ることができます。または名前を位置にマッピングするだけの場合は、カスタムオブジェクトを返すか、辞書に格納してください。

複数のものを同時に返す関数は、通常、それ自体では簡単には理解できません。だから、呼び出しコードが結果を扱うために少し表現力豊かになったらうまくいきます。そうすれば、1年後でさえ理解しやすくなります。

1

ことの一つはこれです:

lists = [list1, list2, list3, list4] 
data = myfunc() 
for x, ls in zip(data, lists): 
    ls.append(x) 

あなたの関数が多数のためのもので、非常に大きなタプルを返す場合は、これを行うことだけは本当に理にかなっていますリスト。あなたの例のように2つしかない場合は、あなたの現在の解決策を守る方が良いでしょう。

1

私はあなたが1行でこれをしたいと思う理由は分からないが、これはタスク実現:この文は便利な何も返さないこと list(map(lambda x: x[0].append(x[1]), zip([name_list, pos_list], my_func())))

注意を、それはあなたのためだけにあなたのリストを変更します。

[lst.append(myfunc()[i]) for i, lst in enumerate([name_list, pos_list])] 

これはpythonlistsmutableであることを事実を利用しています:functionは、より多くの値がenumeratelist comprehensionを使用することができ戻った場合に有用であろうこと、これを達成するために

+0

私の答えは基本的にstyblのものと同じアプローチですが、私はそれを1行に詰め込もうとしました。私は彼の答えが私のものよりも非常に難しいと言いたい。 –

+0

まだそこにあるものすべてを詰めることができるという小道具を持たなければならない – stybl

+0

このようなギミックコードを書くことができるという小道具だが、同時に、これを真剣に提案するべきだとは思わないこれを行う。 – poke

1

長い道。

関連する問題