如何将生成器转换为列表?

时间:2019-04-08 15:42:23

标签: sage

我正在对一个数字列表执行数学函数,但是我得到的是生成器而不是另一个列表的结果。

我尝试过将“ for”循环放在首位,但是它给了我typeMonoidElement

ciphertext =  ([((G**block)*([choice(list(range(n)))]**n))%(n**2)] for block in blocks)

我希望输出是数字列表,但我却得到了生成器。

1 个答案:

答案 0 :(得分:0)

我不知道block是什么,但是一般来说,许多Python东西现在确实会返回生成器而不是列表。我只是整理了一些内容以完成您的示例。

blocks = [1,2,24,5]
ciphertext =  ([((G**block)*([choice(list(range(n)))]**n))%(n**2)] for block in blocks)
cipher text

这将返回<generator object <genexpr> at 0x7fcf3c5403c0>等。实际上,这是一个功能!现在,您不必将整个列表保存在内存中,并且只要方便就可以对其进行迭代。

但是,如果您想要一个列表,则可以通过两种方式进行。

  • list(cipher text)
  • [block^2 for block in blocks]

您使用括号而不是括号(在美式英语中使用);父母制造了一个发电机。希望这会有所帮助。


另外,您的代码需要大量额外的工作。我刚刚创建的生成器没有注意到G是未定义的,并且n当前是一个函数,而不是整数!这是同一件事的简单示例。

blocks = [1,2,24,5]
ciphertext =  (block^2 for block in blocks)
print ciphertext
list(cipher text)

<generator object <genexpr> at 0x7fcf3c540410>
[1, 4, 576, 25]

还请注意,贤哲允许您执行x^2而不是x**2。享受圣人!