Python迭代不同长度两列表时短列表自动循环复用的实现方法
实现方案
核心用itertools.cycle实现短列表自动循环:这个工具可以把传入的可迭代对象包装成无限迭代器,元素取完后会自动从头开始循环取值,配合普通zip使用时,会在较长的列表遍历完成后自动终止,完全匹配需求。
针对你给出的示例,直接写即可:
import itertools list_1 = [1, 2, 3, 4, 5] list_2 = ['a', 'b'] for i, j in zip(list_1, itertools.cycle(list_2)): print(i, j)
运行输出和预期完全一致:
1 a 2 b 3 a 4 b 5 a
如果是通用场景,事先不确定两个列表哪个更长,可以加个简单的长度判断,自动选择要循环的短列表,适配任意长度差的情况:
import itertools def zip_with_cycle(iter1, iter2): # 转换为列表方便取长度,如果传入本身是列表可以跳过这步 seq1, seq2 = list(iter1), list(iter2) if len(seq1) < len(seq2): return zip(itertools.cycle(seq1), seq2) return zip(seq1, itertools.cycle(seq2)) # 不管哪个列表更长都能正常工作 # 比如短列表在第一个位置时: # for i,j in zip_with_cycle([1,2], ['a','b','c','d','e']): # print(i,j) # 输出为: # 1 a # 2 b # 1 c # 2 d # 1 e
这个实现没有额外的内存开销,cycle不会真的把短列表重复拼接成长度匹配的新列表,只是迭代到末尾时重置取值指针,大体积列表场景下也可以放心用。
内容的提问来源于stack exchange,提问作者smoke
相关产品推荐
相关产品推荐

