当前位置: 首页 > 面试题库 >

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

凌钊
2023-03-14
问题内容

首先,对我对该问题的描述不充分表示歉意。我找不到更好的了。

我发现将列表应用于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函数的内部工作有关。尽管如此,今天却让我感到惊讶。


问题答案:

这是记录:

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

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



 类似资料: