当使用operator.itemgetter填充时,itertools.groupby返回空列表项

lef*_*rav 1 python python-itertools operator-keyword

我正在尝试使用函数groupby和itemgetter,以便将元组的排序列表重新排列成组

from itertools import groupby
from operator import itemgetter

#initialize a list of tuples
indexed_qualityresults = [(u'moses-R4', 2.0), (u'moses-R4', 3.0), (u'lucy-R4', 3.0), (u'trados-R4', 2.0)]

#group tuples, using as a key the first element of each tuple
groupped_qualityresults = list(groupby(indexed_qualityresults, itemgetter(0)))

#print the key and the respective grouped tuples for each group
print "groupped_qualityresults =", [(a,list(b)) for a,b in groupped_qualityresults]
Run Code Online (Sandbox Code Playgroud)

输出是

groupped_qualityresults = [(u'moses-R4', []), (u'lucy-R4', []), (u'trados-R4', [(u'trados-R4', 2.0)])]
Run Code Online (Sandbox Code Playgroud)

如您所见,然后为tmy原始元组列表的两个第一个键返回的列表是空的,尽管它们不应该是.

预期产量:

groupped_qualityresults = [(u'moses-R4', [(u'moses-R4', 2.0), (u'moses-R4', 3.0)]), (u'lucy-R4', [(u'lucy-R4', 3.0)]), (u'trados-R4', [(u'trados-R4', 2.0)])]
Run Code Online (Sandbox Code Playgroud)

有人可以辨别出什么问题吗?

Mar*_*ers 5

不要叫list()groupby迭代:

#group tuples, using as a key the first element of each tuple
groupped_qualityresults = groupby(indexed_qualityresults, itemgetter(0))

#print the key and the respective grouped tuples for each group
print "groupped_qualityresults =", [(a,list(b)) for a,b in groupped_qualityresults]
Run Code Online (Sandbox Code Playgroud)

itertools.groupby()文档:

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

将输出groupby()转换为列表会使groupby()对象前进.