困惑于itertools groupby求和

Wel*_*lls 1 python

考虑一下...

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))
Run Code Online (Sandbox Code Playgroud)

第一个print()调用显示正确的#,4表示pid1,5表示2。第二个print()调用在键列表中循环显示,两个都显示0。这是怎么回事?

ely*_*ely 5

rows您从中获得的对象groupby是一种生成器,只能使用一次。当您遍历第一个print语句时,您将消耗这些值,因此rows当您下次尝试对其进行遍历时,将成为一个空生成器-您已经访问并用尽了对其迭代功能的访问权限。

如果希望项目在多次迭代遍历中保持不变,row_list = list(rows)则可以使用然后使用row_list

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