2017-06-29 3 views
2

タプルで複数の値を返す関数を扱うとき、私はしばしば次のイディオムを使ってリストの解読の中から結果を解くことができます。Pythonがリストの解読を空の入力で解く

fiz, buz = zip(*[f(x) for x in input]) 

時間のほとんどは、これは正常に動作しますが、inputが空の場合、それはValueError: need more than 0 values to unpackをスローします。私はこの問題を回避するためと考えることができる2つの方法が

fiz = [] 
buz = [] 
for x in input: 
    a, b = f(x) 
    fiz.append(a) 
    buz.append(b) 

if input: 
    fiz, buz = zip(*[f(x) for x in input]) 
else: 
    fiz, buz = [], [] 

ですが、入力された場合、特にPython的フォーマこれらの感触のどちらが過度に冗長であり、後者は動作しません。リストではなくジェネレータ(if/elseを必要とするのに加えて、私が実際に必要とされるべきではないと感じる場所)。

これを行う簡単な方法はありますか?私は最近Python 2.7で作業していましたが、Python 3のソリューションが異なる場合には、それを知ることにも興味があります。

答えて

0

私はこの種のものにcollections.namedtuple()を使用することを考えます。私は、指定されたタプルがもっと無声だと考えて、複雑なリストの理解とzip/unpackingの必要性を避けるべきです。 documentationから


あなたが使用することができ
>>> p = Point(11, y=22)  # instantiate with positional or keyword arguments 
>>> p[0] + p[1]    # indexable like the plain tuple (11, 22) 
33 
>>> x, y = p    # unpack like a regular tuple 
>>> x, y 
(11, 22) 
>>> p.x + p.y    # fields also accessible by name 
33 
>>> p      # readable __repr__ with a name=value style 
Point(x=11, y=22) 
+0

私は 'namedtuple'sに精通していますが、ここでどのように役立つのか分かりません。通常、私がこのようなことをしているとき、 'fiz'と' buz'は一緒に計算するのに便利で必要な2つの別個のものですが、解凍されたら別々に扱われます。 – Nyle

0

:リストに関する

fiz = [] 
buz = [] 
results = [fiz, buz] 

for x in input: 
    list(map(lambda res, val: res.append(val), results, f(x))) 

print(results) 

注意(マップ(...)):のpython3で、マップはそう、発電機を返しますラムダが実行されるようにするには使用する必要があります.listはそれを行います。

(あなたが他のアイデアを見つけることができるPythonic way to append output of function to several listsに私の答えから適応。)

0

f = lambda x: (x,x**2)場合、これは

x,y = zip(*map(f,input)) if len(input) else ((),()) 

input=[]場合は、x=() and y=()に動作します。

input=[2]場合は、x=(2,) and y=(4,)

input=[2,3]場合は、x=(2,3) and y=(4,9)

彼らはタプル(ないリスト)ですが、変更するのは簡単thatsのthatsの。