循环组合两个不同长度的列表

时间:2013-07-06 01:07:27

标签: python list combinations

我有两个清单:

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

我要列出名单:

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

换句话说,在它们之间进行循环组合。所以,我的问题是:哪种方式更有效?

2 个答案:

答案 0 :(得分: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')]

答案 1 :(得分: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')]

但是你现在有了一个灵活的基础,可以从中获得各种有趣的东西。