Python 连接两个不带'的列表;t长度相同,重复最短 我有两份清单: 我的预期产出:

Python 连接两个不带'的列表;t长度相同,重复最短 我有两份清单: 我的预期产出:,python,list,Python,List,所以基本上我想把两个列表连接起来,当它们的长度不一样时,我必须通过从一开始就重复来分散其他列表中的项目 我试过: 使用zip(),但对这种情况不好,因为它的连接长度相等 >>> list(zip(l1,l2)) [(1, 'a'), (2, 'b'), (3, 'c')] 您可以使用,以便zip聚合来自l1和循环版本的l2的元素: from itertools import cycle list(zip(l1, cycle(l2))) # [(1, 'a'), (2, 'b

所以基本上我想把两个列表连接起来,当它们的长度不一样时,我必须通过从一开始就重复来分散其他列表中的项目

我试过: 使用zip(),但对这种情况不好,因为它的连接长度相等

>>> list(zip(l1,l2))
[(1, 'a'), (2, 'b'), (3, 'c')]
您可以使用,以便
zip
聚合来自
l1
和循环版本的
l2
的元素:

from itertools import cycle

list(zip(l1, cycle(l2)))
# [(1, 'a'), (2, 'b'), (3, 'c'), (4, 'a'), (5, 'b')]


cycle
在您正在循环的iterable与其他iterable组合或压缩时非常有用,因此一旦其他iterable耗尽,迭代过程就会停止。否则它将无限期地循环(如果有一个
循环
生成器,或者正如@chepner指出的,所有其他iterables也是无限的)

如何循环工作?当我在zip()之外调用它时,它似乎创建了一个无止境的循环。Cycle在与其他某个iterable组合时非常有用,因此当另一个iterable耗尽时,迭代过程就会停止,因为Cycle将无限期地循环@vdkd这正是它所做的,但它是惰性地这样做的。由于
zip
一旦到达较短参数的末尾,就停止读取其两个参数,因此不存在无限循环。如果你给出
zip
所有无限序列,或者如果你使用
itertools.zip\u longest
至少有一个无限序列,你会得到一个无限循环。
count
repeat
也会产生无限序列,就像使用无限循环或无终止递归的生成器函数一样。我只是吹毛求疵,主要是为了避开预期的问题。答案是肯定的。
>>> list(zip(l1,l2))
[(1, 'a'), (2, 'b'), (3, 'c')]
from itertools import cycle

list(zip(l1, cycle(l2)))
# [(1, 'a'), (2, 'b'), (3, 'c'), (4, 'a'), (5, 'b')]