Python中的itertools.groupby在早期实现groupby结果时很奇怪

时间:2014-03-28 07:23:33

标签: 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)

结果是:

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 个答案:

答案 0 :(得分:4)

这是documented

  

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

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

答案 1 :(得分:1)

文档中的示例不如:

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

将迭代器转换为键的元组列表和组列表:[(key,[group])]如果这是所需的。