有人可以解释为什么这些在 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/