【问题标题】:generator to list conversion yields different results when it is done in or outside the a list comprehension [duplicate]生成器到列表的转换在列表理解内部或外部完成时会产生不同的结果[重复]
【发布时间】:2018-09-14 04:44:01
【问题描述】:

我的代码 sn-p 行为怪异;我做了另一个来说明这个问题。我认为这两个 sn-ps 应该会产生相同的结果,但不会:

alphas = np.arange(5)
args = zip(np.arange(5), np.arange(5))

output = [np.mean([ a+b for a, b in args]) for _ in alphas]

屈服

[4.0, nan, nan, nan, nan]

alphas = np.arange(5)
args = zip(np.arange(5), np.arange(5))
args = list(args)  # <- this is the only difference

output = [np.mean([ a+b for a, b in args]) for _ in alphas]

屈服

[4.0, 4.0, 4.0, 4.0, 4.0]

唯一的区别是生成器被转换为列表推导内的列表。 有谁了解导致结果不同的潜在机制?

【问题讨论】:

  • 为您修复了输出。
  • zip 返回一个迭代器,并且您尝试对其进行多次迭代(每个 _ in alphas 一次)。
  • 感谢您的回答和编辑。抱歉交换输出。

标签: python numpy generator list-comprehension


【解决方案1】:

一个生成器只产生一次输出序列。您的第一个表达式在 out for 的第一次迭代中使用整个序列。当 _ 从 0 前进到 1 并循环以再次遍历 args 时,yield 没有任何剩余,并且您有一个空返回。这将导致 nan 对应于 mean 值。

在您的第二个示例中,args 是一个静态列表;您可以根据需要多次迭代。

【讨论】:

  • 哦,我明白了!谢谢你的解释:)
  • 感谢您的编辑。我为我所犯的错误道歉。
猜你喜欢
  • 2016-06-14
  • 2018-04-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-01
  • 2020-02-16
  • 2013-07-22
  • 2017-08-05
相关资源
最近更新 更多