考虑这个...
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。
