在使用 itertools.groupby() 方法进行分组时,需要注意数据列表或迭代器的元素必须是有序的。否则,可能会出现无法正确分组或分组结果与预期不同的问题。
除了数据的有序性外,还需要注意 groupby() 方法的工作原理。它是根据相邻的元素进行比较,如果相邻的元素的 key 相同,则将它们视为一组,否则将它们视为不同的组。
因此,如果有两个相同 key 的元素不是相邻的,则它们被视为不同的组。举个例子,假设我们有以下数据:
from operator import itemgetter
from itertools import groupby
data = [{'id': 1, 'name': 'John'},
{'id': 2, 'name': 'Joe'},
{'id': 3, 'name': 'John'},
{'id': 4, 'name': 'Mary'},
{'id': 5, 'name': 'John'},
{'id': 6, 'name': 'Joe'}]
for k,v in groupby(data, key=itemgetter('name')):
print(k,v)
结果为:
John <itertools._grouper object at 0x7f71c1b3bb80>
Joe <itertools._grouper object at 0x7f71c1b31d30>
John <itertools._grouper object at 0x7f71c1b3bb80>
Mary <itertools._grouper object at 0x7f71c1b31d30>
John <itertools._grouper object at 0x7f71c1b3bb80>
Joe <itertools._grouper object at 0x7f71c1b31d30>
排序处理
from operator import itemgetter
from itertools import groupby
data = [{'id': 1, 'name': 'John'},
{'id': 2, 'name': 'Joe'},
{'id': 3, 'name': 'John'},
{'id': 4, 'name': 'Mary'},
{'id': 5, 'name': 'John'},
{'id': 6, 'name': 'Joe'}]
sorted_data = sorted(data, key=itemgetter('name'))
for k,v in groupby(sorted_data, key=itemgetter('name')):
print(k,v)
排序后分组的结果为:
Joe <itertools._grouper object at 0x7f71c0aa16d0>
John <itertools._grouper object at 0x7f71c1b31d30>
Mary <itertools._grouper object at 0x7f71c1b3bb80>