python中itertools.izip的反函数是什么?

时间:2016-10-20 23:03:43

标签: python list python-2.7 itertools

我看到了thisthis个问题,我希望能够产生相同的效果,只能通过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方式。如果一切都失败了,我会这样做。

1 个答案:

答案 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)]