gpt4 book ai didi

python - itertools.groupby : iterate over groups pairwise

转载 作者:行者123 更新时间:2023-11-28 22:56:51 24 4
gpt4 key购买 nike

如何成对迭代 groupby 结果?我尝试的方法不太奏效:

from itertools import groupby,izip

groups = groupby([(1,2,3),(1,2),(1,2),(3,4,5),(3,4)],key=len)

def grouped(iterable, n):
return izip(*[iterable]*n)

for g, gg in grouped(groups,2):
print list(g[1]), list(gg[1])

我得到的输出:

[] [(1, 2), (1, 2)]
[] [(3, 4)]

我想要的输出:

[(1, 2, 3)] [(1, 2), (1, 2)]
[(3, 4, 5)] [(3, 4)]

最佳答案

import itertools as IT

groups = IT.groupby([(1,2,3),(1,2),(1,2),(3,4,5),(3,4)], key=len)
groups = (list(group) for key, group in groups)

def grouped(iterable, n):
return IT.izip(*[iterable]*n)

for p1, p2 in grouped(groups, 2):
print p1, p2

产量

[(1, 2, 3)] [(1, 2), (1, 2)]
[(3, 4, 5)] [(3, 4)]

您发布的代码非常有趣。它有一个普通的问题,也有一个微妙的问题。

普通的问题是 itertools.groupby 返回一个迭代器,它在每次迭代时输出一个键和一个组。由于您只对组感兴趣,而不对键感兴趣,因此您需要类似的东西

groups = (group for key, group in groups)

这个微妙的问题更难解释——我不确定我是否完全理解它。这是我的猜测:groupby 返回的迭代器已经转换了它的输入,

[(1,2,3),(1,2),(1,2),(3,4,5),(3,4)]

变成一个迭代器。 groupby 迭代器环绕底层数据迭代器类似于 csv.reader 环绕底层文件对象迭代器的方式。您将通过此迭代器一次,并且仅一次。 itertools.izip 函数在 groups 中配对项的过程中,导致 groups 迭代器从第一项前进到第二项。由于您只通过迭代器一次,第一个项目已被消耗,因此当您调用 list(g[1]) 时它是空的。

解决此问题的 不太令人满意 是将中的迭代器转换为列表:

groups = (list(group) for key, group in groups)

因此 itertools.izip 不会过早地使用它们。编辑:转念一想,这个修复还不错。 groups 仍然是一个迭代器,并且仅在使用时将 group 转换为列表。

关于python - itertools.groupby : iterate over groups pairwise,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14875714/

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