Python列表向右旋转k次时k大于列表长度运行异常问题排查
问题原因
代码异常的核心原因是未对旋转次数做列表长度取模处理:
- 列表向右旋转k次的效果,和旋转
k % 列表长度次完全一致,旋转次数等于列表长度时相当于回归原状态 - 当旋转次数超过列表长度时,
len(list) - num会得到负数,此时range()函数的运行结果不符合预期:第一个循环会生成远多于预期的索引值,第二个循环因终止值为负直接变成空循环,最终输出的列表长度、元素顺序都会出错 - 额外说明:原代码使用
list作为参数名,覆盖了Python内置的list类型关键字,属于不规范的编码习惯,容易引发后续不可预知的错误,建议修改为其他自定义参数名
修复后的代码
list1 = [1, 2, 3, 4, 5, 6] def rotate(input_list, num): # 兼容空列表场景 if not input_list: return [] # 旋转次数取模,等效为0到列表长度-1次的有效旋转 num = num % len(input_list) output = [] for value in range(len(input_list) - num, len(input_list)): output.append(input_list[value]) for value in range(0, len(input_list) - num): output.append(input_list[value]) return output rotateNum = int(input("请输入你想要将列表向右旋转的次数:")) print(rotate(list1, rotateNum))
更简洁的Python实现
利用列表切片特性可以更高效地实现旋转逻辑:
def rotate(input_list, num): if not input_list: return [] num = num % len(input_list) return input_list[-num:] + input_list[:-num]
内容的提问来源于stack exchange,提问作者amelia
相关产品推荐
相关产品推荐

