循环 2 个列表,重复最短直到最长结束

Posted

技术标签:

【中文标题】循环 2 个列表,重复最短直到最长结束【英文标题】:Loop over 2 lists, repeating the shortest until end of longest 【发布时间】:2011-06-16 11:49:07 【问题描述】:

我确信有一种简单而明显的方法可以做到这一点,但我一直在谷歌搜索和阅读文档,但我找不到任何东西。

这就是我想要实现的目标:

la = ['a1', 'a2', 'a3', 'a4']
lb = ['b1', 'b2']
result = ['a1_b1', 'a2_b2', 'a3_b1', 'a4_b2']

我有一个日期列表,其中一些日期上有标记。然后我有一个更大的日期列表,我想尽可能多次地将最小的列表放入更大的列表中。它可能需要某种循环,因为我需要访问较大列表中的日期以获得最终结果。

出于某种原因,我只是看不到这样做的好方法。

【问题讨论】:

这能回答你的问题吗? How to zip two differently sized lists? 这能回答你的问题吗? Permutations between two lists of unequal length 【参考方案1】:

试试

result = ["_".join((i, j)) for i, j in itertools.izip(la, itertools.cycle(lb))]

【讨论】:

izip is replaced with built-in zip in Python 3 如果不知道lalb中的哪一个会先用完怎么办?【参考方案2】:

假设lalb 长:

>>> import itertools
>>> [x+'_'+y for x,y in zip(la, itertools.cycle(lb))]
['a1_b1', 'a2_b2', 'a3_b1', 'a4_b2']

itertools.cycle(lb)lb 中的元素返回一个循环迭代器。

zip(...) 返回一个元组列表,其中每个元素对应于 la 中的一个元素以及迭代器中的匹配元素。

【讨论】:

【参考方案3】:
import itertools
la = ['a1', 'a2', 'a3', 'a4']
lb = ['b1', 'b2']
for i, j in zip(la, itertools.cycle(lb)):
    print('_'.join((i,j)))

【讨论】:

以上是关于循环 2 个列表,重复最短直到最长结束的主要内容,如果未能解决你的问题,请参考以下文章

Shell脚本的循环:重复执行命令

Laravel 5.1 Blade - 循环数组直到其内部数组结束

冒泡排序1

Shell脚本--循环(forwhileuntil)

第 4 章 操作列表

如何在 C++ 中创建重复直到循环?