itertools.groupby() 未正确分组
- 2025-04-10 09:46:00
- admin 原创
- 16
问题描述:
我有这些数据:
self.data = [(1, 1, 5.0),
(1, 2, 3.0),
(1, 3, 4.0),
(2, 1, 4.0),
(2, 2, 2.0)]
当我运行此代码时:
for mid, group in itertools.groupby(self.data, key=operator.itemgetter(0)):
我list(group)
得到:
[(1, 1, 5.0),
(1, 2, 3.0),
(1, 3, 4.0)]
这正是我想要的。
但如果我使用 1 代替 0
for mid, group in itertools.groupby(self.data, key=operator.itemgetter(1)):
按元组中的第二个数字分组,我只得到:
[(1, 1, 5.0)]
即使其他元组在该 1(第 2 个)位置上有“1”。
解决方案 1:
itertools.groupby将具有相同键的连续项收集在一起。如果您想要具有相同键的所有项,则必须self.data
先进行排序。
for mid, group in itertools.groupby(
sorted(self.data,key=operator.itemgetter(1)), key=operator.itemgetter(1)):
解决方案 2:
不进行排序的变体(通过字典)。性能方面应该会更好。
def full_group_by(l, key=lambda x: x):
d = defaultdict(list)
for item in l:
d[key(item)].append(item)
return d.items()
解决方案 3:
下面“修复”了 Python 的几个烦恼itertools.groupby
。
def groupby2(l, key=lambda x:x, val=lambda x:x, agg=lambda x:x, sort=True):
if sort:
l = sorted(l, key=key)
return ((k, agg((val(x) for x in v))) \n for k,v in itertools.groupby(l, key=key))
具体来说,
它不需要您对数据进行排序。
它并不要求您必须
key
仅使用命名参数。输出是干净的生成器,
tuple(key, grouped_values)
其中值由第三个参数指定。能够轻松应用 sum 或 avg 等聚合函数。
示例用法
import itertools
from operator import itemgetter
from statistics import *
t = [('a',1), ('b',2), ('a',3)]
for k,v in groupby2(t, itemgetter(0), itemgetter(1), sum):
print(k, v)
这打印,
a 4
b 2
玩一下这个代码
相关推荐
热门文章
项目管理软件有哪些?
热门标签
曾咪二维码
扫码咨询,免费领取项目管理大礼包!
云禅道AD