寻找一种优雅的方式来同时循环两个不同长度的列表

时间:2019-02-07 20:21:21

标签: python python-3.x

我正在寻找最优雅/简短/ pythonic的方法来同时遍历两个不平坦的列表。如果较短的列表在某个时刻结束,则应从头开始进行迭代。

到目前为止,我设法使用while来做到这一点,我认为它很丑陋,而且时间太长(由于各种原因,我需要尽可能短的代码)。

list1 = ["a", "b", "c"]
list2 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

i1 = 0
i2 = 0
while True:
    if i2 == len(list2):
        break
    if i1 == len(list1):
        i1 = 0
    print(list1[i1], list2[i2])
    i1 += 1
    i2 += 1

预期结果应如下所示。我是通过while循环(上面的代码)实现的。但是我需要尽可能短的代码:

a 1
b 2
c 3
a 4
b 5
c 6
a 7
b 8
c 9
a 10

5 个答案:

答案 0 :(得分:9)

AuthService都列出,将最短的一个输入itertools.cycle,以便无限期重复(直到zip结束):

list2

打印:

import itertools

list1 = ["a","b","c"]
list2 = [1,2,3,4,5,6,7,8,9,10]

for a,b in zip(itertools.cycle(list1),list2):
    print(a,b)

(当然不要使用a 1 b 2 c 3 a 4 b 5 c 6 a 7 b 8 c 9 a 10 ,因为itertools.zip_longest永远不会结束,这会造成无限循环)

答案 1 :(得分:5)

您可以这样做:

list1 = ["a", "b", "c"]
list2 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

for i, e in enumerate(list2):
    print(list1[i % len(list1)], e)

输出

a 1
b 2
c 3
a 4
b 5
c 6
a 7
b 8
c 9
a 10

答案 2 :(得分:4)

我所拥有的东西比您所拥有的要干净一些,并且不需要您事先知道哪个更大。不知道这是否是最优雅/简短/ pythonic的处理方式,但是可以这样:

list1 = ["a","b","c"]
list2 = [1,2,3,4,5,6,7,8,9,10]

length1 = len(list1)
length2 = len(list2)

for i in range(max(length1,length2)):
    print(list1[i%length1],list2[i%length2])

打印以下内容:

a 1
b 2
c 3
a 4
b 5
c 6
a 7
b 8
c 9
a 10

答案 3 :(得分:1)

如果您不知道列表的大小,请使用sorted进行获取:

list1 = ["a", "b", "c"]
list2 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

shorter, longer = sorted([list1, list2], key=len)

现在您可以itertools.cycle较短的一个,zip

for item1, item2 in zip(cycle(shorter), longer):
    ...

这不一定会按照您原来想要的顺序打印您的项目(左侧list1,右侧list2)。要解决此问题,您可以手动计算较长的列表:

iter1, iter2 = cycle(list1), list2 if len(list1) < len(list2) else list1, cycle(list2)
for item1, item2 in zip(iter1, iter2):
    ...

您可以通过以下方式将其变成单线

for item1, item2 in zip(*(cycle(list1), list2 if len(list1) < len(list2) else list1, cycle(list2))):
    ...

答案 4 :(得分:0)

使用itertools

import itertools
list1 = ["a","b","c"]
list2 = [1,2,3,4,5,6,7,8,9,10]
print(list(itertools.cycle(list1), list2))