2017-07-25 48 views
1

檢索所有迭代器值比方說,我有這將產生兩個值生成函數:從發生器功能

def gen_func(): 
    for i in range(5): 
     yield i, i**2 

我想找回我的函數的所有迭代器值。目前我使用這個代碼片段爲此目的:

x1, x2 = [], [] 
for a, b in gen_func(): 
    x1.append(a) 
    x2.append(b) 

這對我有用,但似乎有點笨重。有沒有更緊湊的編碼方式?我在想:

x1, x2 = map(list, zip(*(a, b for a, b in gen_func()))) 

但是,這只是給我一個語法錯誤。 PS:我知道我可能不應該使用一個生成器來達到這個目的,但我在其他地方需要它。

編輯:任何類型的x1x2將工作,但是,我更喜歡列表我的情況。

+0

x1和x2的所需類型是什麼?名單?元組?只要它是可迭代的,什麼都可以? – Kevin

+0

我寧願列表。感謝您的評論,我更新了我的問題。 – Nyps

回答

5

如果x1x2可元組,它足以做

>>> x1, x2 = zip(*gen_func()) 
>>> x1 
(0, 1, 2, 3, 4) 
>>> x2 
(0, 1, 4, 9, 16) 

否則,你可以使用map申請list迭代器:

x1, x2 = map(list, zip(*gen_func())) 

只是爲了好玩,同樣的事情可以使用擴展迭代解包來完成:

>>> (*x1,), (*x2,) = zip(*gen_func()) 
>>> x1 
[0, 1, 2, 3, 4] 
>>> x2 
[0, 1, 4, 9, 16] 
+1

這樣的代碼是我非常喜歡python的原因... –

+0

謝謝各位各位的好評! – Nyps

3

你幾乎已經:

x1, x2 = map(list, zip(*gen_func()))