Python:传参实现自定义次数的列表左右旋转功能
自定义旋转次数的列表旋转实现方案
现有代码的可优化点
你当前实现的旋转函数仅支持单次旋转,且直接操作全局列表变量,要支持自定义旋转次数,可以做以下调整:
- 为旋转函数新增旋转次数入参
k - 对旋转次数做取模处理:当旋转次数大于列表长度时,旋转
n次(n为列表长度)等价于不旋转,通过k = k % n可以跳过无意义的重复操作 - 让函数接收待旋转的列表作为参数,不直接依赖全局变量,提升通用性
- 默认不修改原始传入列表,返回旋转后的新列表,避免副作用
基础修改版本(兼容原有单次旋转逻辑)
table = [1, 10 ,20, 0, 59, 86, 32, 11, 9, 40] def rotate_left(arr, k=1): n = len(arr) if n == 0: return arr k = k % n # 拷贝原列表,避免修改输入数据 res = arr.copy() for _ in range(k): res.append(res.pop(0)) return res def rotate_right(arr, k=1): n = len(arr) if n == 0: return arr k = k % n res = arr.copy() for _ in range(k): res.insert(0, res.pop()) return res # 用法示例 print(rotate_left(table, 3)) # 左旋转3次 print(rotate_right(table, 2)) # 右旋转2次 print(rotate_left(table)) # 不传k默认左旋转1次,兼容原有逻辑 print(rotate_left(table, 12)) # 旋转次数超过列表长度,自动等价于左旋转2次
更高性能的切片实现
如果列表数据量较大,循环调用pop/insert的性能较差,可以直接用Python列表切片实现,时间复杂度更低:
def rotate_left_fast(arr, k=1): n = len(arr) if n == 0: return arr k = k % n return arr[k:] + arr[:k] def rotate_right_fast(arr, k=1): n = len(arr) if n == 0: return arr k = k % n return arr[-k:] + arr[:-k]
说明
- 上述实现默认不修改原始输入列表,如果需要直接在原列表上修改,去掉拷贝操作、直接操作入参即可
- 参数
k默认值设为1,原来不传参调用单次旋转的逻辑也能正常运行 - 增加了空列表判断,避免传入空列表时触发索引错误
内容的提问来源于stack exchange,提问作者Koji E
相关产品推荐
相关产品推荐

