【问题标题】:Python zip object 'disappears' after iterating through?迭代后Python zip对象“消失”?
【发布时间】:2015-04-08 01:06:53
【问题描述】:

这里的菜鸟问题,但我真的很想知道答案。

我不知道为什么 zip 对象在我尝试以列表形式遍历它之后简单地“消失”: 例如。

>>> A=[1,2,3]
>>> B=['A','B','C']
>>> Z=zip(A,B)
>>> list(Z)
>>> [('C', 3), ('B', 2), ('A', 1)]
>>> {p:q for (p,q) in Z}
{1: 'A', 2: 'B', 3: 'C'}
>>> {p:q for (p,q) in list(Z)}
{}
>>> list(Z)
[]

(这是在 Python 3.4.2 中)

有人可以帮忙吗?

【问题讨论】:

标签: list oop python-3.x zip


【解决方案1】:

Python2 到 Python3 之间的行为发生了变化:
在python2中,zip返回list of tuples,而在python3中返回an iterator

迭代器的本质是,一旦完成对数据的迭代 - 它指向一个空集合,这就是您正在经历的行为。

Python2

Python 2.7.9 (default, Jan 29 2015, 06:28:58)
[GCC 4.2.1 Compatible Apple LLVM 6.0 (clang-600.0.56)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> A=[1,2,3]
>>> B=['A','B','C']
>>> Z=zip(A,B)
>>> Z
[(1, 'A'), (2, 'B'), (3, 'C')]
>>> list(Z)
[(1, 'A'), (2, 'B'), (3, 'C')]
>>> list(Z)
[(1, 'A'), (2, 'B'), (3, 'C')]
>>> list(Z)
[(1, 'A'), (2, 'B'), (3, 'C')]
>>> {p:q for (p,q) in Z}
{1: 'A', 2: 'B', 3: 'C'}
>>> Z
[(1, 'A'), (2, 'B'), (3, 'C')]
>>> Z
[(1, 'A'), (2, 'B'), (3, 'C')]

Python3

Python 3.4.2 (v3.4.2:ab2c023a9432, Oct  5 2014, 20:42:22)
[GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> A=[1,2,3]
>>> B=['A','B','C']
>>> Z=zip(A,B)
>>> list(Z)
[(1, 'A'), (2, 'B'), (3, 'C')]
>>> list(Z)
[]
>>>

【讨论】:

  • 我还想问一下,这种“耗尽”行为是否只是为了提高内存效率而设计的?
  • 我相信是的,是的:正如 Simeon Visser 在他的回答中所建议的那样,通过将 zip()list() 包装起来很容易实现相同的行为。但是,当您不需要将整个序列保存在内存中时 - 丢弃我们已经迭代过的项目会更有效。
【解决方案2】:

zip 创建一个对象,用于对结果进行一次迭代。这也意味着它在一次迭代后就耗尽了:

>>> a = [1,2,3]
>>> b = [4,5,6]
>>> z = zip(a,b)
>>> list(z)
[(1, 4), (2, 5), (3, 6)]
>>> list(z)
[]

您需要在每次想要使用它时调用zip(a,b) 或存储list(zip(a,b)) 结果并重复使用它。

【讨论】:

  • 从 python2 迁移到 python2 的 list(zip(a,b)) 运行良好
【解决方案3】:

对于 python 2 和 3,我使用

xzip = zip
zip = lambda *x: list(xzip(*x))

然后 zip 总是返回一个列表而不是一个迭代器。

IMO,xzip 在 python 3 中可能是 zip 的更好名称。

【讨论】:

    猜你喜欢
    • 2019-06-03
    • 2018-02-04
    • 2021-07-05
    • 2016-10-27
    • 1970-01-01
    • 1970-01-01
    • 2019-12-03
    • 2014-07-11
    • 1970-01-01
    相关资源
    最近更新 更多