2014-01-24 33 views
0

遞增地生成一個元組,我需要一個函數,它從序列列表中一次返回一個元組而不使用zip。我試圖做這種方式:返回一個像zip這樣的元組列表,使用comprehensions

gen1=[(x,y)for x in range(3) for y in range(4)] 

這給下面的列表:

[(0, 0), (0, 1), (0, 2), (0, 3), (1, 0), (1, 1), (1, 2), (1, 3), (2, 0), (2, 1), (2, 2), (2, 3)] 

下一個我試圖在同一時間返回一個元組:

next(gen1) 

但是,一個發生錯誤,該列表不是'可迭代的'。我怎麼能用發電機做到這一點。

+0

爲什麼你不能使用'zip'?這似乎是一個完美的解決方案。 –

回答

1

對於Python 2.4,你可以這樣做:

gen1 = ((x, y) for x in range(3) for y in range(4)) 

注意,你總是可以從列表發電機(當然,迭代器)與iter

gen1 = iter([(x, y) for x in range(3) for y in range(4)]) 

中使用的差別將沒有。第二種方式將需要整個列表在內存中,雖然第一種方法不會。

請注意,您也可以使用zip的內置功能,它是一個生成器(在Python 3中)。在Python 2中,使用itertools.izip

的Python 3:

>>> zip(range(0, 5), range(3, 8)) 
<zip object at 0x7f07519b3b90> 
>>> list(zip(range(0, 5), range(3, 8))) 
[(0, 3), (1, 4), (2, 5), (3, 6), (4, 7)] 

的Python < 3:

# Python < 3 
>>> from itertools import izip 
>>> izip(range(0, 5), range(3, 8)) 
<itertools.izip object at 0x7f5247807440> 
>>> list(izip(range(0, 5), range(3, 8))) 
[(0, 3), (1, 4), (2, 5), (3, 6), (4, 7)] 
>>> zip(range(0, 5), range(3, 8)) 
[(0, 3), (1, 4), (2, 5), (3, 6), (4, 7)] 
+0

thankyou它運行良好 – Ramya

+0

但我必須通過使用此函數生成元組的上述列表:'def generator_zip(seq1,seq2,* more_seqs):'如何在兩個以上的序列中生成生成器..? ?@Noctua – Ramya

+0

@ user3226258:這正是'zip'所做的。這是一個發電機。 – Noctua

1

如果你想要的行爲與序列任意數量的工作,同時也有在問題還存在一些模糊之處,如果你想做的只是做一個拉鍊的發電機版本,下面應該很好:

def generator_zip(*args): 
    iterators = map(iter, args) 
    while iterators: 
     yield tuple(map(next, iterators)) 

首先它將每個參數變成一個迭代器,然後繼續生成包含每個迭代器的下一個相關條目的元組,直到最短列表耗盡。

+0

如果這是他真正的問題,這將是奇怪的,因爲這正是'zip'的作用...... – Noctua

+0

我嘗試過,但它給出以下結果:「DEF generator_zip(SEQ1,SEQ2,* more_seqs): 迭代=地圖(ITER,more_args) 而迭代: 收率元組(圖(下,迭代器)) 通 >>> generator_zip(範圍(5),範圍(3),範圍(4),範圍(5)) <發電機對象generator_zip在0x00DB3B48>'@ Slater Tyranus – Ramya

+0

@Noctua它實際上不是。這將返回一個壓縮內容的生成器版本,它允許您懶惰地加載大型列表而不會遇到內存問題。 –

相關問題