【问题标题】:list function on generator deletes elements生成器上的列表函数删除元素
【发布时间】:2019-09-10 13:21:16
【问题描述】:

我不明白为什么下面的代码会删除所有元素。如何预防?

from sympy.utilities.iterables import variations
x=variations(["H","T"],3, True)
print(list(x))

t=sum(1 for i in x)
print(list(x))

【问题讨论】:

  • 如果变体返回一个生成器,然后你使用list 打印它,你会消耗所有元素,所以如果你想保留它就不要打印它
  • @aws_apprentice 所以sum(1 for i in x) 也消耗元素? for 也有功能?如何防止这种情况发生,以便我可以首先在列表中找到元素的数量,然后使用for 循环多次遍历它。
  • 当生成器有大量元素时,如何有效地做到这一点?
  • 是的,任何对生成器的操作都会消耗它。如果您需要从中使用一定数量的数字,请将它们保存到单独的数据结构中并使用它。
  • 使用x = list(x) 生成器生成的列表。 itertools 具有类似 tee 的复制迭代器的功能。但我不确定这会让你的代码更有效率。

标签: python iterator generator sympy iterable


【解决方案1】:

可以使用生成器,这就是第 3 行 print(list(x)) 中发生的情况。解决此问题的一种方法是将其保存为列表,尽管在这种情况下可能有更合适的解决方案。

y = list(x)
print(y)
t = len(y)  # Since y is a list, we can use len
print(y)

还请注意,您可以使用任何生成器重现此行为。 Sympy 不是重点。

【讨论】:

  • 感谢您的回复。可以请你看看我上面贴的cmets吗?
  • @AlGuy 当然。首先,如果不对其进行迭代,就无法获得生成器中元素的数量,这会耗尽它。其次,IMO 效率是另一个主题,因此您可以提出一个新问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-03
  • 2019-07-06
  • 1970-01-01
  • 2014-11-13
  • 2022-01-26
  • 1970-01-01
相关资源
最近更新 更多