Skip to main content
 首页 » 编程设计

python之对 itertools groupby 求和感到困惑

2025年05月04日10xxx_UU

考虑这个...

from itertools import groupby 
from operator import itemgetter 
 
data = [{'pid': 1, 'items': 1}, {'pid': 2, 'items': 5}, {'pid': 1, 'items': 3}] 
data = sorted(data, key=itemgetter('pid')) 
 
for pid, rows in groupby(data, lambda x: x['pid']): 
    print(pid, sum(r['items'] for r in rows)) 
    for key in ['items']: 
        print(pid, sum(r[key] for r in rows)) 

第一个 print() 调用打印正确的 #,4 代表 pid 1,5 代表 2。第二个 print() 调用,在通过键列表的循环中,为两者打印 0。怎么回事?

请您参考如下方法:

您从 groupby 获得的 rows 对象是一种只能使用一次的生成器。当您为第一个 print 语句迭代它时,您使用了这些值,因此 rows 是一个空生成器,当您下次尝试对其进行迭代时——您已经访问并用完了您可以访问其迭代功能。

您可以使用 row_list = list(rows) 然后使用 row_list 如果您希望项目在多次迭代过程中保持不变。

为了更加清晰,我建议将您的代码放入 Python REPL 并在该循环中检查 type(rows),并查看该对象提供的 API。