from collections import defaultdict
import itertools
items = [(0, 0), (0, 1), (1, 0), (1, 1)]
keyfunc = lambda x: x[0]
# Grouping yourself
item_map = defaultdict(list)
for item in items:
item_map[keyfunc(item)].append(item)
# Using itertools.groupby
item_map = {}
for key, group in itertools.groupby(items, keyfunc):
item_map[key] = [i for i in group]
为什么我应该使用 itertools.groupby
而不是自己编写代码?它是否可以在更少的时间复杂度下执行分组操作?或者,我的用例有什么遗漏,需要使用 groupby
处理其他情况?
另一个帖子提到,如果要分组的项没有按键排序(或者只是键连续),itertools.groupby
将返回不同的结果。
例如,对于items = [(0, 0), (1, 1), (0, 2)]
,如果我们不按键排序,itertools.groupby
将返回
{0: [(0, 2)], 1: [(1, 1)]}
而我的实现返回
{0: [(0, 0), (0, 2)], 1: [(1, 1)]}
除非我误解了重点,否则DIY方法似乎更好,因为它不需要对数据进行排序。
这是文档:
创建一个迭代器,从可迭代对象中返回连续的键和组。键是计算每个元素的键值的函数。如果未指定或为None,则键默认为身份函数,并返回未更改的元素。通常,可迭代对象需要在相同的键函数上已经排序。