Как увеличить значение внутри генератора - PullRequest
0 голосов
/ 01 марта 2020

Я хочу выполнить следующее в генераторе, который выполняет итерацию по файлу ~ 5 ГБ:

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 для l oop или библиотеки, такой как pandas).

Ответы [ 3 ]

1 голос
/ 01 марта 2020

Создайте Counter как

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

, и теперь он подсчитал ваши страны.

0 голосов
/ 01 марта 2020

Использование нового оператора Walrus в Python 3.8

(c[item['country']]:=c[item['country']]+1 for item in item_data)

Это позволяет вам выполнять присваивания выражений, делая его синтаксически допустимым в тех местах, где это не так, например, в понимании

0 голосов
/ 01 марта 2020

Один из способов - передать генератор стран на 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)]
...