給列出的A,B如何從Python中的兩個列表中生成一個生成器?
a = [5, 8, 9]
b = [6, 1, 0]
我想創建一個發電機根這樣的:
for x in gen:
print x
輸出
5, 8, 9, 6, 1, 0
給列出的A,B如何從Python中的兩個列表中生成一個生成器?
a = [5, 8, 9]
b = [6, 1, 0]
我想創建一個發電機根這樣的:
for x in gen:
print x
輸出
5, 8, 9, 6, 1, 0
你可以使用itertools.chain
:
>>> from itertools import chain
>>> a = [5, 8, 9]
>>> b = [6, 1, 0]
>>> it=chain(a,b)
>>> for x in it:
print x,
...
5 8 9 6 1 0
'iter(..)'不會生成一個生成器,它會生成一個迭代器。你寧願做'連鎖(a,b)'。 'a + b'只是將兩個列表的新副本合併在一起,這在您不需要該副本時效率不高。 – 2013-05-02 19:44:47
@JochenRitzel好點,我解決了這個問題。 – 2013-05-02 19:49:07
def chain(*args):
for arg in args:
for item in arg:
yield item
a = [5, 8, 9]
b = [6, 1, 0]
for x in chain(a,b):
print x,
print ', '.join(map(str,chain(a,b)))
你可以使用generator expressions一個可笑的Python的優雅的一行:
>>> a=[5,8,9]
>>> b=[6,1,0]
>>> g=(i for i in a+b)
測試:
>>> for i in g:
print i
5
8
9
6
1
0
或測試#2,如果你真的喜歡有之間的逗號每個項目,:
>>> print ', '.join(map(str,g))
5, 8, 9, 6, 1, 0
'(我爲我在a + b)'產生長度爲len(a)+ len(b)的新列表c = a + b。這可能不是最佳的。 – 2013-05-07 11:47:33
確實如此,但優化並不是OP問題的一部分......無論如何,這對合並現代計算機上的兩個列表並不重要。這可能是python包含這些糖的原因。另外,如果你真的想要一個最佳的解決方案,我建議以某種方式從python移到C。但這是事實,這不是最佳的。 – cedbeu 2013-05-07 20:19:09
所以...你*不要*要''9''梨在輸出? – 2013-05-02 19:50:26
woops,我的壞,編輯有9在那裏 – Bovard 2013-05-02 22:30:34