如何优雅实现短列表遍历索引越界后从头循环及扩展列表?
优雅实现短列表循环匹配长列表的需求
需求说明
已知两个列表my_list_1和my_list_2,且len(my_list_1) < len(my_list_2),需要完成两个目标:
- 遍历两个列表时,当索引超出
my_list_1长度,让my_list_1的索引从头循环,避免越界错误,同时将对应位置元素相加存入结果列表。 - 实现
extend_list函数,将my_list_1复制扩展至指定长度(即my_list_2的长度),例如输入[1,2,3]和长度5,返回[1,2,3,1,2]。
示例场景
my_list_1 = [1,2,3] my_list_2 = [5,6,7,8,9] result = [] # 期望的计算逻辑: # i == 0: 1 + 5 = 6 # i == 1: 2 + 6 = 8 # i == 2: 3 + 7 = 10 # i == 3: 1 + 8 = 9 # i == 4: 2 + 9 = 11
已有实现(写法繁琐)
你尝试的两种方法虽能运行,但逻辑冗余:
方法1:
x = 0 for i in range(len(my_list_2)): if i % (len(my_list_1) - 1) == 0 or i == 0: x = 0 else: x+=1 result.append(my_list_1[x] + my_list_2[i])
方法2:
x = 0 for i in range(len(my_list_2)): if x == (len(my_list_1) - 1) or i == 0: x = 0 else: x += 1 result.append(my_list_1[x] + my_list_2[i])
优雅实现方案
1. 直接遍历相加的简洁写法
利用取模运算直接计算my_list_1的循环索引,这是最直观高效的方式:
my_list_1 = [1,2,3] my_list_2 = [5,6,7,8,9] result = [] len_1 = len(my_list_1) for i in range(len(my_list_2)): # 用i对my_list_1长度取模,自动循环索引 result.append(my_list_1[i % len_1] + my_list_2[i]) print(result) # 输出: [6, 8, 10, 9, 11]
如果追求极致简洁,可用列表推导式:
len_1 = len(my_list_1) result = [my_list_1[i % len_1] + num for i, num in enumerate(my_list_2)]
2. extend_list扩展函数实现
提供两种风格的实现,可根据场景选择:
方法一:循环生成(直观易读)
def extend_list(short_list, target_len): len_short = len(short_list) if len_short == 0: return [] return [short_list[i % len_short] for i in range(target_len)] # 测试 print(extend_list([1,2,3], 5)) # 输出: [1,2,3,1,2]
方法二:列表拼接(性能更优)
通过计算重复次数和剩余元素数,直接拼接列表,底层优化过的列表乘法比循环遍历效率更高:
def extend_list(short_list, target_len): len_short = len(short_list) if len_short == 0: return [] # 计算完整重复次数和剩余元素数量 repeat_times = target_len // len_short remainder = target_len % len_short # 拼接结果 return short_list * repeat_times + short_list[:remainder] # 测试 print(extend_list([1,2,3], 5)) # 输出: [1,2,3,1,2]
内容的提问来源于stack exchange,提问作者MuteKnOwMORE
相关产品推荐
相关产品推荐

