【问题标题】:TypeError: 'generator' object has no attribute '__getitem__'TypeError:“生成器”对象没有属性“__getitem__”
【发布时间】:2015-08-30 21:14:22
【问题描述】:

我写了一个生成函数,它应该返回一个字典。但是,当我尝试打印字段时,出现以下错误

print row2['SearchDate']
TypeError: 'generator' object has no attribute '__getitem__'

这是我的代码

from csv import DictReader
import pandas as pd
import numpy as np


def genSearch(SearchInfo):
    for row2 in DictReader(open(SearchInfo)):
        yield row2

train = 'minitrain.csv'

SearchInfo = 'SearchInfo.csv'

row2 = {'SearchID': -1}

for row1 in DictReader(open(train)):
    if 'SearchID' in row1 and 'SearchID' in row2 and row1['SearchID'] == row2['SearchID']:
        x = deepcopy( row1 )
        #x['SearchDate'] = row2['percent']
        x.update(row2)    
        print 'new'
        print x
    else: 
        #call your generator
        row2 = genSearch(SearchInfo)
        print row2['SearchDate']

【问题讨论】:

  • 您期望row2 包含什么; DictReader()的第一行?
  • 是的@MartijinPieters
  • 调用生成器函数会生成生成器对象,而不是生成器的下一个值。创建一次生成器,将其存储在某处,然后使用该生成器生成值(如 hspandher 在他们的回答中所示)。

标签: python python-2.7 dictionary yield yield-return


【解决方案1】:

生成器返回一个迭代器,你需要明确地调用它。

你的最后一行代码应该类似于 -

rows_generator = genSearch(SearchInfo)
row2 = next(rows_generator, None)
print row2['SearchDate']

理想情况下,我们在循环中使用迭代器,它会自动为我们做同样的事情。

【讨论】:

    【解决方案2】:

    生成器必须是 iterators ,而不是 iterables。可迭代包含 __item__()__getitem__() 方法,而迭代器包含 next() / __next__() 方法(python 版本 2.x/3.x)。

    【讨论】:

      猜你喜欢
      • 2012-12-04
      • 2012-10-15
      • 2014-01-16
      • 2017-02-27
      • 2018-01-28
      • 2014-06-10
      • 2012-10-16
      • 2015-11-04
      • 1970-01-01
      相关资源
      最近更新 更多