gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 13:20:05 26 4
gpt4 key购买 nike

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

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com