提早实现groupby结果时Python中itertools.groupby的怪异

for*_*tyj 1 python python-itertools

首先,为我对问题的描述不佳而道歉。我找不到更好的了。

我发现将列表应用于 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)
Run Code Online (Sandbox Code Playgroud)

结果是:

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']]
Run Code Online (Sandbox Code Playgroud)

这可能与 groupby 函数的内部工作有关。尽管如此,今天还是让我感到惊讶。

Bre*_*arn 7

这是记录在案

返回的组本身就是一个迭代器,它与 共享底层可迭代对象groupby()。由于源是共享的,当groupby()对象前进时,之前的组不再可见。

当你这样做时list(groupby(...)),你将 groupby 对象一直推进到最后,这会丢失除最后一个之外的所有组。如果您需要保存组,请按照文档中的说明进行操作,并在迭代 groupby 对象时保存每个组。