在使用 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>
在使用itertools.groupby()对数据进行分组时,必须确保数据是有序的,因为该方法基于相邻元素的key进行分组。如果元素不相邻但key相同,它们会被分为不同组。例如,对未排序的包含用户信息的数据列表进行分组,John和John可能不会被归为同一组。通过先对数据按key排序,可以得到正确的分组结果。
4284

被折叠的 条评论
为什么被折叠?



