Python中提前实现itertools.groupby结果时的奇怪现象

1 投票
2 回答
1679 浏览
提问于 2025-04-18 00:17

首先,抱歉我对问题的描述不太清楚。我找不到更好的说法。

我发现把列表应用到 itertools.groupby 的结果上会破坏这个结果。看看下面的代码:

import itertools
import operator

log = '''\
hello world
hello there
hi guys
hi girls'''.split('\n')

data = [line.split() for line in log]

grouped = list(itertools.groupby(data, operator.itemgetter(0)))

for key, group in grouped:
    print key, group, list(group)

print '-'*80

grouped = itertools.groupby(data, operator.itemgetter(0))

for key, group in grouped:
    print key, group, list(group)

结果是:

hello <itertools._grouper object at 0x01A86050> []
hi <itertools._grouper object at 0x01A86070> [['hi', 'girls']]
--------------------------------------------------------------------------------
<itertools.groupby object at 0x01A824E0>
hello <itertools._grouper object at 0x01A860B0> [['hello', 'world'], ['hello', 'there']]
hi <itertools._grouper object at 0x01A7DFF0> [['hi', 'guys'], ['hi', 'girls']]

这可能和 groupby 函数的内部工作原理有关。不过今天这让我感到很惊讶。

相关问题:

2 个回答

2

文档中的例子没有下面这个好:

list((key, list(group)) for key, group in itertools.groupby(...))

它把迭代器转换成了一个包含键和分组列表的元组,比如:[(key,[group])],如果你想要这样的结果的话。

7

这里有个文档说明

返回的组其实是一个迭代器,它和groupby()使用的是同一个可迭代对象。因为它们共享这个源,所以当你在使用groupby()的时候,如果往前走一步,之前的组就看不见了。

当你执行list(groupby(...))时,你会把groupby对象推进到最后,这样就只保留了最后一个组,之前的组都没了。如果你想保存这些组,按照文档里的说明,在遍历groupby对象的时候,记得把每个组都保存下来。

撰写回答