python - python 2.7 中的 zip 和 groupby 好奇心

标签 python python-2.7 python-3.x

有人可以解释为什么这些在 Python 2.7.4 中输出不同的东西吗?他们在 python 3.3.1 中输出相同的东西。我只是想知道这是否是 2.7 中已在 3 中修复的错误,或者是否由于语言的某些更改所致。

>>> for (i,j),k in zip(groupby([1,1,2,2,3,3]), [4,5,6]):
...     print list(j)
... 
[]
[]
[3]
>>> for i,j in groupby([1,1,2,2,3,3]):
...     print list(j)
... 
[1, 1]
[2, 2]
[3, 3]

最佳答案

这不是一个错误。它与 groupby 可迭代对象何时被消耗有关。使用 python3 尝试以下操作,您将看到相同的行为:

from itertools import groupby
for (i,j),k in list(zip(groupby([1,1,2,2,3,3]), [4,5,6])):
    print (i,list(j),k)

请注意,如果您删除外部 list,则会得到您期望的结果。这里的“问题”是 grouper 对象(在 j 中返回)是一个可迭代对象,只要它们相同就会产生元素。它事先不知道会产生什么或有多少元素。它只是接收一个可迭代对象作为输入,然后从该可迭代对象中产生结果。如果您转到下一个“组”,那么在您有机会查看元素之前,可迭代对象就会被消耗掉。这是一个设计决策,允许 groupby 对产生任意(甚至无限)数量的元素的迭代进行操作。

在 python2.x 中,zip 将创建一个列表,甚至在循环开始之前有效地移动过每个“组”。这样做时,它最终会消耗 groupby 返回的每个“组”对象。这就是为什么您只报告了列表中的最后一个元素。 python2.x 的修复是使用 itertools.izip 而不是 zip。在 python3.x 中,izip 成为内置的 zip。正如我所见,在这个脚本中支持这两种方法的唯一方法是通过类似的东西:

from __future__ import print_function
from itertools import groupby
try:
    from itertools import izip
except ImportError:  #python3.x
    izip = zip

for (i,j),k in izip(groupby([1,1,2,2,3,3]), [4,5,6]):
    print (i,list(j),k)

关于python - python 2.7 中的 zip 和 groupby 好奇心,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16598244/

相关文章:

python - 在 Python3.3 中使用 virtualenvwrapper 是否意味着我不能(或不应该)使用 pyvenv?

python - 如何遍历元组字典?

python - 生成模型越来越长

python - 如何在运行时使用类型定义具有内部类的类?

python - 使用 Python 统计文本文件中所有单词的实例

python - 机器人框架 : do print statements actually get output anywhere?

python - 你如何在 Python 中建模随时间变化的东西?

python - 使用boto3通过subnet_id查找route_table_id

当搜索字段为空时,Django SearchFilter 显示所有数据

python-2.7 - 在 python 中加载预训练的手套向量