首先,我对这个问题的描述很不好。我找不到更好的。早期通过Python实现groupby的itertools.groupby的怪异
我发现将列表应用于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功能的内部工作。不过今天让我感到吃惊。
如果你想这样做,不需要使用'list',直接使用列表理解:'[(key,list(group))for key,itertools.groupby(...)]' – BrenBarn
@BrenBarn在Python 2和Python 3上,Python 2和Python 2都没有相同的行为,但它泄漏了生成器表达式所没有的变量。这在Python 3中得到了修复,但是这样做会减少在list()上使用'[]'的速度。而且也不能简单地用'dict'代替'list'并取而代之'{key:[group]}'。 –