Python:将列表转换为生成器

swo*_*der 20 python

说我有一个清单

data = []
data.append("A")
data.append("B")
data.append("C")
data.append("D")
Run Code Online (Sandbox Code Playgroud)

如何将此转换为生成器类型?任何有关示例代码的帮助都非常感谢...

找到一个URL http://eli.thegreenplace.net/2012/04/05/implementing-a-generatoryield-in-a-python-c-extension/

这是我想做的吗?

Dav*_*vid 21

>>> (n for n in [1, 2, 3, 5])
<generator object <genexpr> at 0x02A52940>
Run Code Online (Sandbox Code Playgroud)

适用于Python 2.7.4+

>>> a2g = lambda x : (n for n in x)
>>> a2g([1, 2, 3, 4, 5])
<generator object <genexpr> at 0x02A57CD8>
Run Code Online (Sandbox Code Playgroud)

编辑:

lambda发电机工厂模式的另一个细微变化

>>> a2g = lambda *args: (n for n in args)
>>> for i in a2g(1, 2, 3, 4, 5): print i

1
2
3
4
5
Run Code Online (Sandbox Code Playgroud)


Hei*_*ann 19

你确定,你想创建一个发电机吗?生成器是返回迭代器类型的函数,例如通过使用yield关键字(参见term-generator)构造.如果你真的想要这个,steven-rumbalski的回答正是你要找的:

data_gen = (y for y in data)
Run Code Online (Sandbox Code Playgroud)

大多数情况下,您需要直接创建迭代器对象,例如使用该next()方法.在这种情况下,答案隐含在以上mgilson的评论中:

data_iter = iter(data)
Run Code Online (Sandbox Code Playgroud)

相当于data_iter = data.__iter__(),参见 功能#iter.


Ste*_*ski 6

字面上的等价物是:

def data_generator():
    yield 'A'
    yield 'B'
    yield 'C'
    yield 'D'
Run Code Online (Sandbox Code Playgroud)

调用生成器函数会返回生成器迭代器.将generator-iterator传递给列表构造函数会给出:

>>> list(data_generator())
['A', 'B', 'C', 'D']
Run Code Online (Sandbox Code Playgroud)

也可以使用生成器表达式创建此生成器迭代器:

data_iter = (c for c in 'ABCD')
Run Code Online (Sandbox Code Playgroud)

注意: 您在列表中填写了四个附加语句.这通常不是你怎么写的.

而是做:

data = ['A', 'B', 'C', 'D']
Run Code Online (Sandbox Code Playgroud)


Cam*_*arr 5

import itertools
iter_data = itertools.chain(data)
Run Code Online (Sandbox Code Playgroud)

像这样:

In [10]: data
Out[10]: [1, 2, 3, 4, 5, 6, 7, 8, 9]

In [11]: iter_data=itertools.chain(data)

In [12]: iter_data
Out[12]: <itertools.chain at 0x1ce8950>

In [13]: iter_data.next()
Out[13]: 1
Run Code Online (Sandbox Code Playgroud)

  • FWIW,这与`iter_data = iter(data)` 没有什么不同......你实际上并没有在这里链接任何东西。 (10认同)