gpt4 book ai didi

python - itertools 中的 grouper() 示例

转载 作者:太空宇宙 更新时间:2023-11-03 21:00:14 25 4
gpt4 key购买 nike

我是Python新手。在阅读 python 标准库引用时,我对 itertools 食谱部分中的 grouper() 示例感到困惑。

我尝试将示例代码放入一个小程序中,如下所示:

from itertools import zip_longest
import copy

def grouper(iterable, n, fillvalue=None):
"Collect data into fixed-length chunks or blocks"
args = [iter(iterable)] * n
# print each string in args
#c = copy.deepcopy(args)
#for a in c:
# print(list(a))
return zip_longest(*args, fillvalue=fillvalue)

def main():
print("this is our first test script file")
g = grouper('ABCDEFG', 3, 'x')
# print each string in results
#for s in g:
# print(list(s))

main()

如果我们删除评论标签,将会产生如下结果:

['A', 'B', 'C', 'D', 'E', 'F', 'G']
[]
[]
['A', 'B', 'C']
['D', 'E', 'F']
['G', 'x', 'x']

这对我来说看起来不太正确,因为 args 变量的结果是:

['A', 'B', 'C', 'D', 'E', 'F', 'G']
[]
[]

zip_longest() 调用如何产生如下所示的结果?

['A', 'B', 'C']
['D', 'E', 'F']
['G', 'x', 'x']

它应该是 A,B,C,D,... 因为 args 中的第二个和第三个列表是空的。还是我错过了什么?

谁能给我解释一下吗?

最佳答案

zipzip_longest 在如何使用参数方面与 deepcopy 有很大不同。

grouper 之所以有效,是因为 zipzip_longest 一次从每个参数中获取一个元素。例如,考虑一下:

i1 = i2 = i3 = iter([1, 2, 3, 4, 5, 6])
zip(i1, i2, i3)

由于 i1i2i3 共享同一个迭代器,因此推进一个迭代器也会推进其他迭代器。 zip 的作用是:

  1. i1中获取一个元素。
  2. i2 中获取一个元素。
  3. i3 中获取一个元素。
  4. 生成这些元素的元组。
  5. 重复第 1 步。

举个例子,会发生这样的事情:

第一次迭代:

  1. i1中获取一个元素。 => 1
  2. i2中获取一个元素。 => 2
  3. i3中获取一个元素。 => 3
  4. 生成这些元素的元组 => (1, 2, 3)

第二次迭代:

  1. i1中获取一个元素。 => 4
  2. i2中获取一个元素。 => 5
  3. i3中获取一个元素。 => 6
  4. 生成这些元素的元组 => (4, 5, 6)

现在,在本例中,deepcopy 仅复制迭代器。它不会以任何方式消耗它们。然而,您的 for 循环确实会消耗它们:

  1. i1获取所有内容。 => 1, 2, 3, 4, 5, 6, StopIteration 引发
  2. i2获取一切。 => StopIteration 引发
  3. i3获取一切。 => StopIteration 引发

因此,您会得到所看到的结果。

关于python - itertools 中的 grouper() 示例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55755834/

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