我正在寻找最优雅/简短/ 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
答案 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))