如何在生成器中增加一个值

How to increment a value inside a generator

我希望在遍历 ~5GB 文件的生成器中执行以下操作:

from collections import Counter
c=Counter()
lines_as_list = (line.strip().split('|') for line in open('file-00000-of-00001.csv'))
header = next(lines_as_list)
item_data = (dict(zip(header, data)) for data in lines_as_list)
totals_per_country = (c[item['country']]+=1 for item in item_data)

这当然失败了,因为试图在理解范围内分配一个值。在生成器中执行此操作的建议方法是什么(不使用 for 循环或 pandas 等库)。

创建你的 Counter 作为

c = Counter(item['country']for item in item_data)

现在您的国家/地区已统计在内。

一种方法是将国家/地区的生成器传递给 Counter,因为这需要一个可迭代对象。例如:

>>> countries = (item['country'] for item in item_data)
>>> totals_per_country = Counter(countries) # not a generator, evaluates immediately
>>> totals_per_country.most_common(5)
[('US', 299072), ('CA', 183927), ('GB', 150242), ('AU', 131295), ('DE', 100611)]

使用 Python 3.8

中的新 Walrus 运算符
(c[item['country']]:=c[item['country']]+1 for item in item_data)

这允许您对表达式进行赋值,使其在语法上不合法的地方合法,例如理解