2016-10-20 31 views
1

我看到了thisthis問題,我想要達到同樣的效果,只能用itertool.izip高效完成。python中itertools.izip的逆函數是什麼?

itertool.izip的文檔:

像拉鍊()不同的是它返回一個迭代器,而不是

我需要一個迭代,因爲我不能滿足於內存中的所有值的列表所以相反,我使用了一個生成器並遍歷這些值。

更具體地說,我有一個生成器生成三個值元組,而不是迭代它,我想爲三個函數提供三個值列表,每個列表代表元組中的單個位置。

在這些三元組值中,只有一個具有大項目(內存消耗明智)(稱爲data),而另外兩個僅包含只需要少量內存的值,所以遍歷data值的「值列表」應該首先消耗data的值,並緩存小值。

我想不出一種聰明的方法來一次生成一個「值列表」,因爲我可能決定偶爾刪除一個三值元組的實例,具體取決於元組的大值。

使用普遍建議zip解決方案,類似於:這在「拆包參數列表」部分

>>> zip(*[('a', 1), ('b', 2), ('c', 3), ('d', 4)]) 
[('a', 'b', 'c', 'd'), (1, 2, 3, 4)] 

結果(* [...]),能夠在整個迭代器觸發一個完整的迭代(我假設)將所有結果緩存在內存中,正如我所說的,這對我來說是一個問題。

我可以建立一個掩碼列表(True/False爲小值保留),但我正在尋找更清潔更pythonic的方式。如果一切都失敗了,我會這樣做。

+0

因此,'數據'值可能會進入三元組的第三個條目,而第一個和第二個是較短的列表,是的?你能描述一下當那些較短的名單用盡時應該發生什麼嗎?最好給出一個明確的例子,使用兩個非常短的列表和一個稍長的列表。 – barny

+0

@barny列表本身都具有相同的長度,我正在討論列表中單個值的大小(即內存要求)。數據值太大,無法一起保存在內存中。 – NirIzr

+0

措辭確實不清楚,編輯。 – NirIzr

回答

2

傳統環路有什麼問題?

>>> def gen(): 
...  yield 'first', 0, 1 
...  yield 'second', 2, 3 
...  yield 'third', 4, 5 
... 
>>> numbers = [] 
>>> for data, num1, num2 in gen(): 
...  print data 
...  numbers.append((num1, num2)) 
... 
first 
second 
third 
>>> numbers 
[(0, 1), (2, 3), (4, 5)] 
+0

謝謝,這可以工作,但我傳遞數據生成器到一個庫函數,而不控制它如何遍歷值,所以我不能讓它將其他值附加到其他列表。 – NirIzr

+0

@NirIzr - 然後做一個包裝? – TigerhawkT3

+0

是的,謝謝!不知道我是如何忽略這一點的。 – NirIzr

相關問題