【问题标题】:Python - why can't I get at dict items in a generator?Python - 为什么我不能在生成器中获取 dict 项目?
【发布时间】:2018-12-05 23:18:50
【问题描述】:

我创建了一个从大型 CSV 文件中读取每一行并返回每一行的生成器:

def csv_reader(filename):
    import csv
    with open(filename) as f:
        reader = csv.DictReader(f)
        for line in reader:
            yield  dict(line)


filename = "output.csv"
generator = csv_reader(filename)

我知道如何迭代生成器并获得输出:

# Iterate Generator
for g in generator:
    print(g)

这会打印字典。

但是,如何访问每个字典中每个键的值?以下没有返回任何内容。

for g in generator:
    print(g['user'])

这也不行:

>>> for g in generator:
...     alist.append(g.keys())
...     alist
... 
>>> alist
[]

【问题讨论】:

  • 澄清一下,你每次都重新创建生成器吗?

标签: python-3.x generator


【解决方案1】:

看起来您正在迭代一个现在为空的生成器。

我的意思是,一旦你迭代你的生成器一次,它就会被清空,再次迭代它不会有任何结果:

>>> def some_generator():
...     yield 1
...     yield 2
...     yield 3
... 
>>> generator = some_generator()
>>> for g in generator:
...     print(g)
... 
1
2
3
>>> for g in generator:
...     print(g)
... 

有两种解决方法:要么将生成器结果存储在列表中,以便您可以多次迭代列表(消耗内存),要么重新创建生成器(在读取文件时消耗 I/O)。

所以要么:

>>> for g in some_generator():
...     print(g)
... 
1
2
3
>>> for g in some_generator():
...     print(g)
... 
1
2
3

或:

>>> values = list(some_generator())
>>> for g in values:
...     print(g)
... 
1
2
3
>>> for g in values:
...     print(g)
... 
1
2
3

【讨论】:

    猜你喜欢
    • 2022-11-06
    • 2011-03-09
    • 1970-01-01
    • 1970-01-01
    • 2011-11-07
    • 1970-01-01
    • 2010-09-23
    • 1970-01-01
    相关资源
    最近更新 更多