2017-04-19 6 views
1

私は良い解決策を見つけ出していないという質問があります。私は、temp変数を使用せずに、2つ以上のリストに関数出力を追加するためのより良い方法を探しています。以下の例:いくつかのリストに機能の出力を追加するPythonic方法

私はzip(* f())のようなもので遊んでみましたが、そのような解決策はほとんど見つかりませんでした。 これらの一時的なvarsを削除する方法は、非常に便利ですが、ありがとう!

追加情報の編集: この場合、関数の出力数は、追加されるリストの数と常に等しくなります。私がtempsを取り除くために探している主な理由は多分8-10の関数出力があり、その多くの一時変数を持つことは乱雑になるだろう(実際には2つ持つことは嫌いだが)。

+0

forループの各繰り返しで関数を呼び出す必要がありますか? – iafisher

+0

リストの数は、関数によって返されたタプルの要素の数と常に等しいか、関数がただ1つのものだけを返す場合は、その1つの項目をすべてのリストに追加しますか?あなたの質問は少し曖昧です。 – martineau

+1

"Python"コードを書いておきたいなら、[PEP 8 - Style Guide for Python Code](https://www.python.org/dev/peps/pep-0008/)を読んで、それに従うことをお勧めします。他の多くのものの中で、4つのスペースであなたの字下げを示唆しています。 – martineau

答えて

4
def f(): 
    return 5,6 

a,b = zip(*[f() for i in range(10)]) 
# this will create two tuples of elements 5 and 6 you can change 
# them to list by type casting it like list(a), list(b) 
1

私はそれがあなたのためですかニシキヘビわからない

tmp = f() 
a.append(tmp[0]) 
b.append(tmp[1]) 

にしてください。

4

まず解決策:各繰り返しでリストを構築し、

a, b = zip(*[f(i) for i in range(5)]) 

異なるソリューション、:我々は

def f(i): 
    return i, 2*i 

# First make a list of all your results 
l = [f(i) for i in range(5)] 
# [(0, 0), (1, 2), (2, 4), (3, 6), (4, 8)] 

# then transpose it using zip 
a, b = zip(*l) 

print(list(a)) 
print(list(b)) 
# [0, 1, 2, 3, 4] 
# [0, 2, 4, 6, 8] 

それとも、すべて1行でそれをトランスポーズ、その後、すべての結果のリストを作ります彼らが構築されているときには、それらを使用できるように:

def f(i): 
    return 2*i, i**2, i**3 

doubles = [] 
squares = [] 
cubes = [] 
results = [doubles, squares, cubes] 

for i in range(1, 4): 
    list(map(lambda res, val: res.append(val), results, f(i))) 
    print(results) 

# [[2], [1], [1]] 
# [[2, 4], [1, 4], [1, 8]] 
# [[2, 4, 6], [1, 4, 9], [1, 8, 27]] 

print(cubes) 
# [1, 8, 27] 

注意についてlist(map(...)):Python3ではmapがジェネレータを返すので、ラムダを実行するにはそれを使用する必要があります。 listです。

+0

これは一時変数、すなわち 'l'を使用すると主張するかもしれません。リスト作成中にリストを使用するのが難しくなります。 – ilkkachu

+0

これは私の使用例の大部分でこれでうまくいくはずです。ありがとうございます。 – halolord01

+0

@ilkkachu:2つ目のポイントを解決する別のソリューションを追加しました。 –

3

具体的なケースでは、zipの回答が素晴らしいです。

itertools.cycleitertools.chainを使用すると、ラウンドロビン方式で追加する既存のリストがたくさんある場合に便利な、既存の回答とは異なるアプローチです。関数がリストを持つよりも多くの値を返すときにも機能します。

>>> from itertools import cycle, chain 
>>> a, b = [], [] # new, empty lists only for demo purposes 
>>> for l, v in zip(cycle([a, b]), (chain(*(f() for i in range(10))))): 
...  l.append(v) 
... 
>>> a 
[5, 5, 5, 5, 5, 5, 5, 5, 5, 5] 
>>> b 
[6, 6, 6, 6, 6, 6, 6, 6, 6, 6] 
関連する問題