Python:将列表转换为生成器

时间:2013-04-16 15:45:30

标签: python

说我有一个清单

    data = []
    data.append("A")
    data.append("B")
    data.append("C")
    data.append("D")

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

找到了网址http://eli.thegreenplace.net/2012/04/05/implementing-a-generatoryield-in-a-python-c-extension/

这是我想做的吗?

7 个答案:

答案 0 :(得分:18)

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

适用于Python 2.7.4 +

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

编辑:

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

答案 1 :(得分:15)

您确定要创建生成器吗?生成器是返回迭代器类型的函数,例如,使用yield关键字(参见term-generator)。 如果你真的想要这个,那么steven-rumbalski的回答正是你要找的:

data_gen = (y for y in data)

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

data_iter = iter(data)

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

答案 2 :(得分:6)

字面上的等价物是:

def data_generator():
    yield 'A'
    yield 'B'
    yield 'C'
    yield 'D'

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

>>> list(data_generator())
['A', 'B', 'C', 'D']

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

data_iter = (c for c in 'ABCD')

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

相反:

data = ['A', 'B', 'C', 'D']

答案 3 :(得分:3)

import itertools
iter_data = itertools.chain(data)
像这样:

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

答案 4 :(得分:1)

>>> d = ['A', 'B', 'C', 'D']
>>> 
>>> def gen(d):
...     for i in d:
...             yield i
... 
>>> for i in gen(d):
...     print i
... 
A
B
C
D
>>> 

答案 5 :(得分:1)

你的意思是这样的吗?

def gen():
    for x in "ABCD":
        yield x

In [9]: it=gen()

In [10]: next(it)
Out[10]: 'A'

In [11]: next(it)
Out[11]: 'B'

In [12]: next(it)
Out[12]: 'C'

In [13]: next(it)
Out[13]: 'D'

答案 6 :(得分:0)

(item for item in listNameHere).next()

如果我没记错的话,这是做这件事的一般方法。

>>> a = [0,1,2,3,4]
>>> x = (item for item in a)
>>> x
<generator object <genexpr> at 0x028B8440>
>>> x.next()
0
>>> x.next()
1
>>> x.next()
2

等等。