我看到了this和this个问题,我希望能够产生相同的效果,只能通过itertool.izip
高效完成。
来自itertool.izip
的文档:
与zip()类似,不同之处在于它返回迭代器而不是列表
我需要一个迭代器,因为我不能将所有值都适合内存,所以我使用生成器并迭代值。
更具体地说,我有一个生成三个值元组的生成器,而不是迭代它我想将三个值列表提供给三个函数,每个列表代表元组中的一个位置。
在这三个元组值中,只有一个具有大项(明智的内存消耗)(让我们称之为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 :(得分: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)]