首先,我對這個問題的描述很不好。我找不到更好的。早期通過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]}'。 –