【问题标题】:How to increment a value inside a generator如何在生成器中增加一个值
【发布时间】:2020-06-13 17:51:25
【问题描述】:

我希望在迭代 ~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 等库)。

【问题讨论】:

    标签: python python-3.x generator yield


    【解决方案1】:

    将您的Counter 创建为

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

    现在已将您所在的国家/地区计算在内。

    【讨论】:

      【解决方案2】:

      一种方法是将国家/地区的生成器传递给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)]
      

      【讨论】:

        【解决方案3】:

        在 Python 3.8 中使用新的 Walrus 运算符

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

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

        【讨论】:

          猜你喜欢
          • 2013-02-23
          • 2016-09-30
          • 1970-01-01
          • 1970-01-01
          • 2021-10-01
          • 2017-03-11
          • 1970-01-01
          • 2011-08-14
          • 2018-01-30
          相关资源
          最近更新 更多