【问题标题】:Concatenate list with Yield用产量连接列表
【发布时间】:2014-06-25 13:50:35
【问题描述】:

我的推理缺陷在哪里?根据我的理解,yield 的工作方式类似于返回到生成器以继续迭代的 return 语句。我期待代码继续添加到列表中,但出现错误。

def method(self):
    samplelist = []
    while(condition):
         #the data is collected
         samplelist = data
         yield samplelist

finalList += file.method()

编辑: 我最初的错误是由于在没有初始化值时尝试使用 += 连接 finalList 。这已通过使用 finalList.append() 解决,但是,yield 仍然无法正常工作,如果有人能帮助我理解原因,我将不胜感激。

发布了一个相当有用的答案,然后由于某种原因被删除。但它解释说,yield 实际上是返回一个生成器对象。从这里我尝试了一些不同的东西。

1 他们还建议使用 list(file.method()) 对其进行迭代。但是,这进一步将 finalList 的类型更改为元组,并且与我的其余代码不兼容。

2 我试图迭代对象做

for x in file_writer.write_records():
    sample.append(x)

但结果相同。如何附加生成器对象的值?

【问题讨论】:

  • 你的问题是方法是在被调用之后定义的,也许?
  • 注意method的返回值不是一个列表,它是一个生成器对象。如果您想访问产生的项目,您必须使用 for 循环对其进行迭代,或者在生成器上调用 next,或者将其转换为列表。
  • @Kevin OP 不想访问这些项目,他想将它们添加到列表中。 list__iadd__extend方法可以处理迭代器。
  • @sshashank124 " UnboundLocalError: local variable 'finalList' referenced before assignment " ,这对我来说真的没有意义,因为如果我在 method() 中将 samplelist 连接到本地的另一个变量并返回该变量分配给 finalList 它工作正常。
  • @JohnSmith 您目前显示的代码中没有变量sample,所以没有人能真正回答您的问题。

标签: python list concatenation yield


【解决方案1】:

我将忽略一个明显的问题,即 file.method() 未在您发布的代码中声明,因此不能像您显示的那样被调用。所以我将你的生成器函数称为method()。如果您可以发布有效的代码,或者至少是一致的,那将会很有用。

method() 返回一个生成器,而不是一个列表。你可以看到这个

>>> method()
<generator object f at 0x7f8b7a5bda50

您需要解析生成器。这可以通过调用list() 来完成:

finalList += list(method())

现在finalList 将附加method() 的结果。请注意,这将多次调用生成器,直到遇到condition。在生成新数据时,您的代码可能似乎挂起,但是已经完成了。您可以通过在 yield 后添加一个 print 语句来检查这一点,以查看控制权返回到生成器。

这对你会更有用:

for l in method():
    finalList.extend(l)
    # process finalList....

现在控制权在每个数据产生后返回给调用代码,调用代码有机会处理它。

顺便说一句,您不需要在循环中重新绑定 samplelist = [] 时对其进行初始化。

【讨论】:

  • 我不是要附加到 samplelist,重新绑定很好,因为我的意思是使用 yield 将每个重新绑定附加到 finalList,除非我不确定为什么它不起作用
  • @JohnSmith 在您澄清后更新了答案,例如。
猜你喜欢
  • 1970-01-01
  • 2019-05-25
  • 2022-07-05
  • 2010-11-24
  • 1970-01-01
  • 2019-08-24
  • 2011-09-29
  • 2015-02-14
  • 1970-01-01
相关资源
最近更新 更多