iterator.groupby()无法生成正确的结果

时间:2018-12-16 22:25:09

标签: python iterator

代码:

import itertools
first_letter = lambda x: x[0]
names = ['Alan', 'Adam', 'Wes', 'Albert', 'Steven']
for letter, name in itertools.groupby(names, first_letter):
    print(letter, list(name))

输出:

A ['Alan', 'Adam']
W ['Wes']
A ['Albert']
S ['Steven']

我想按第一个元素进行分组,但似乎无法正常工作,这是怎么回事?

1 个答案:

答案 0 :(得分:0)

您可以期望itertools中的任何功能,groupby对共享公共密钥的元素序列进行操作。您必须记住,迭代器可以是任何顺序数据源,可能不像列表那样存储自己的元素。

这意味着,如果尚未在迭代器中对数据进行分组,则groupby将无法按您期望的方式工作。换句话说,无论密钥是否已出现在序列中,groupby都会在密钥更改时启动另一个组。

根据您的情况对数据进行预分组的最简单方法可能是对数据进行排序。列表可以就地排序:

names=['Alan','Adam','Wes','Albert','Steven']
names.sort()
for letter, name in itertools.groupby(names, first_letter):
    print( letter, list(name))

通过将列表分发到字典中可以获得类似的结果。我在下面使用collections.defaultdict是因为它使添加新元素更加容易。您可以轻松地使用常规词典:

grouped = collections.defaultdict(list)
for name in names:
    grouped[name[0]].append(name)

for letter, group in grouped.items():
    print(letter, group)

在任何一种情况下,重点都是您无法期望groupby对原始数据中的元素顺序进行准确的操作。