1
两个合成列表我有两个列表:循环的不同长度
list1 = ['a','b','c']
list2 = ['1','2','3','4','5']
,我想使列表:
list3 = [('1','a'),('2','b'),('3','c'),('4','a'),('5','b')]
换句话说,做他们之间的循环组合。所以,我的问题是:这是更有效的方法吗?
两个合成列表我有两个列表:循环的不同长度
list1 = ['a','b','c']
list2 = ['1','2','3','4','5']
,我想使列表:
list3 = [('1','a'),('2','b'),('3','c'),('4','a'),('5','b')]
换句话说,做他们之间的循环组合。所以,我的问题是:这是更有效的方法吗?
>>> 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')]
这里的另一种方法:即继续发电机永远的循环组合:
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')]
但是你现在有一个灵活的基础,从中可以得到各种其他有趣的位。
Waw!周期是惊人的!非常感谢你! – Pablo
@Volatility:但在这种情况下,结果会不会永远持续下去? – LarsH
@LarsH真的,虽然没有。 – Volatility