【问题标题】:Is it possible to convert a list-type into a generator without iterating through?是否可以在不迭代的情况下将列表类型转换为生成器?
【发布时间】:2011-08-21 11:53:54
【问题描述】:

我知道可以将生成器转换为“低级”列表(例如list(i for i in xrange(10))),但是是否可以在不先遍历列表的情况下进行反向操作(例如(i for i in range(10)))?

编辑: 删除了 cast 一词,以明确我想要实现的目标。

编辑 2: 实际上,我想我可能从根本上误解了生成器。这将教会我在早上喝咖啡之前不要发布 SO 问题!

【问题讨论】:

  • 你不应该在 Python 中使用 cast 这个词,因为 Python 中没有变量,但是类型不能改变的对象
  • @eyquem - 阿门!你甚至不应该认为 Python 中的单词 cast - 这些实际上是实例构造函数,从给定的参数创建一个新对象,而不是将某个地址的内存重新解释为不同的类型。

标签: python list generator


【解决方案1】:

试试这个:an_iterator = iter(a_list) ... docs here。这就是你想要的吗?

【讨论】:

  • 提问者询问关于将列表转换为生成器的问题。 iter() 返回一个不是生成器的迭代器。
【解决方案2】:

我不确定你的意思,但你输入的是有效的 Python 代码:

>>> x = (i for i in range(10))
>>> x
<generator object at 0xb7f05f6c>
>>> for i in x: print i
0
1
2
3
4
5
6
7
8
9

【讨论】:

  • Python 文档的相关链接是here:“生成器表达式产生一个新的生成器对象。它的语法与推导式相同,只是它用括号括起来而不是括号或花括号。”
【解决方案3】:

您可以使用内置函数 list(...) 从迭代器中取出列表,并使用 iter(...) 从列表中取出迭代器:

mylist = list(myiterator)
myiterator = iter(mylist)

确实,您的语法一个迭代器:

iter_10 = (i for i in range(10))

而不是使用提供列表的[...]

看看这个答案Hidden features of Python

【讨论】:

  • 我正在寻找一个不需要遍历原始列表的较低级别的解决方案(例如,在我的示例中为 range(10))。
  • 所以,您可以使用iter(mylist),它将迭代器从您的列表中移除。
  • 您说“确实,您的语法是一个迭代器”,但它实际上不是一个生成器。 myiteratoriter_10 是不同的类型。
【解决方案4】:

确实有可能一个列表拥有迭代器接口:

list_iter = list.__iter__() # or iter(list), returns list iterator
list_iter.__next__() # list_iter.next() for python 2.x

所以,

lst_iter = iter(lst)

成功了。

尽管使用推导并从中生成生成器更有意义:例如

lst_iter_gt_10 = (item for item in lst if item > 10)

【讨论】:

    【解决方案5】:

    接下来是关键:

    next(iter([]), None)
    

    你可以用你想要的任何默认值替换 None

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-11
      • 1970-01-01
      相关资源
      最近更新 更多