代码:
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']
我想按第一个元素进行分组,但似乎无法正常工作,这是怎么回事?
答案 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
对原始数据中的元素顺序进行准确的操作。