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

Python 寻找一个优雅的方式,同时循环两个不同长度的列表,python,python-3.x,Python,Python 3.x,我正在寻找一种最优雅/简短/通俗的方法来同时遍历两个不均匀的列表。如果较短的列表在某个点结束,它应该从一开始就开始迭代 到目前为止,我设法用而,我认为它是丑陋的,而且太长了(由于各种原因,我需要尽可能短的代码)。 预期的结果应该是这样的。我用while循环(上面的代码)实现它。但我需要尽可能短的代码: a 1 b 2 c 3 a 4 b 5 c 6 a 7 b 8 c 9 a 10 zip两个列表,向其中输入最短的一个,使其无限期重复(直到list2结束): 印刷品: a 1 b 2 c 3

我正在寻找一种最优雅/简短/通俗的方法来同时遍历两个不均匀的列表。如果较短的列表在某个点结束,它应该从一开始就开始迭代

到目前为止,我设法用<代码>而,我认为它是丑陋的,而且太长了(由于各种原因,我需要尽可能短的代码)。 预期的结果应该是这样的。我用while循环(上面的代码)实现它。但我需要尽可能短的代码:

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

zip
两个列表,向其中输入最短的一个,使其无限期重复(直到
list2
结束):

印刷品:

a 1
b 2
c 3
a 4
b 5
c 6
a 7
b 8
c 9
a 10
(当然不要使用
itertools.zip\u longest
,因为
循环永远不会结束,这将创建一个无限循环)

您可以:

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

使用
itertools

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

我有一些东西比你的要干净一点,不需要你事先知道哪个更大。不知道这是否是最优雅/简短/通灵的做事方式,但以下是:

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

如果您不知道列表的大小,请使用
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):
    ...
iter1,iter2=cycle(list1),list2如果len(list1)
你可以把它做成一行一行的

for item1, item2 in zip(*(cycle(list1), list2 if len(list1) < len(list2) else list1, cycle(list2))):
    ...
对于zip中的项目1、项目2(*(循环(列表1)、列表2如果len(列表1)
itertools.cycle从中进入
itertools.cycle
。这正是我们要做的事,这并不重要。。我对投票率最高的M3答案进行了测试,结果显示@Hoog的平均表现最好。这是可以忽略和无关的,但对于那些想知道而不做测试的人,请参阅我的测试和更新,如果我退出。加上在我看来它是最干净的。问题被标记为Python-3.xOh。你说得对。当然,只需
zip(itertools.cycle(list1),list))
cleer,这不需要任何额外的导入
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))):
    ...