我看到了this和this問題,我想要達到同樣的效果,只能用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的方式。如果一切都失敗了,我會這樣做。
因此,'數據'值可能會進入三元組的第三個條目,而第一個和第二個是較短的列表,是的?你能描述一下當那些較短的名單用盡時應該發生什麼嗎?最好給出一個明確的例子,使用兩個非常短的列表和一個稍長的列表。 – barny
@barny列表本身都具有相同的長度,我正在討論列表中單個值的大小(即內存要求)。數據值太大,無法一起保存在內存中。 – NirIzr
措辭確實不清楚,編輯。 – NirIzr