考虑一下...
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。这是怎么回事?
rows您从中获得的对象groupby是一种生成器,只能使用一次。当您遍历第一个print语句时,您将消耗这些值,因此rows当您下次尝试对其进行遍历时,将成为一个空生成器-您已经访问并用尽了对其迭代功能的访问权限。
如果希望项目在多次迭代遍历中保持不变,row_list = list(rows)则可以使用然后使用row_list。
为了更加清晰,我建议将您的代码放入Python REPL中并type(rows)在该循环中进行检查,并查看该对象提供的API。
| 归档时间: |
|
| 查看次数: |
150 次 |
| 最近记录: |