2013-07-06 72 views
1

兩個合成列表我有兩個列表:循環的不同長度

list1 = ['a','b','c'] 
list2 = ['1','2','3','4','5'] 

,我想使列表:

list3 = [('1','a'),('2','b'),('3','c'),('4','a'),('5','b')] 

換句話說,做他們之間的循環組合。所以,我的問題是:這是更有效的方法嗎?

回答

10
>>> from itertools import cycle 
>>> list1 = ['a','b','c'] 
>>> list2 = ['1','2','3','4','5'] 
>>> zip(list2, cycle(list1)) 
[('1', 'a'), ('2', 'b'), ('3', 'c'), ('4', 'a'), ('5', 'b')] 

正如一些評論所提到的,如果你想循環兩份名單,並採取第n個元素,你可以做到這一點,

>>> from itertools import islice, izip 
>>> list(islice(izip(cycle(list2), cycle(list1)), 5)) 
[('1', 'a'), ('2', 'b'), ('3', 'c'), ('4', 'a'), ('5', 'b')] 
+0

Waw!週期是驚人的!非常感謝你! – Pablo

+0

@Volatility:但在這種情況下,結果會不會永遠持續下去? – LarsH

+0

@LarsH真的,雖然沒有。 – Volatility

1

這裏的另一種方法:即繼續發電機永遠的循環組合:

def cc(l1, l2): 
    i=0 
    c1 = len(l1) 
    c2 = len(l2) 
    while True: 
    yield (l1[i % c1], l2[i % c2]) 
    i += 1 

字面回答你的問題則是:

x=cc(list2, list1) 
[next(x) for i in range(max(len(list1), len(list2)))] 
[('1', 'a'), ('2', 'b'), ('3', 'c'), ('4', 'a'), ('5', 'b')] 

但是你現在有一個靈活的基礎,從中可以得到各種其他有趣的位。