2013-07-06 141 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')] 

但是你现在有一个灵活的基础,从中可以得到各种其他有趣的位。