Python中如何交换不同长度的子列表?
解决Python中列表子列表交换问题
你的问题出在直接对两个长度不同的切片进行赋值交换时,Python的切片赋值会修改列表的长度和元素位置,导致后续的切片引用偏移,最终出现元素重复和丢失的情况。
正确实现方法
方法1:重新构造列表(推荐)
这种方式简单直观,直接通过列表拼接得到目标结果:
A = [1,2,3,4,5,6] # Original list i,k,j,w = [0,2,3,6] # Indexes # 按目标顺序拼接子列表:交换的后段 + 中间保留部分 + 交换的前段 A = A[j:w] + A[k:j] + A[i:k] print(A) # 输出: [4,5,6,3,1,2]
方法2:原地修改列表
如果你需要原地修改原列表(不创建新列表),可以分步操作:
A = [1,2,3,4,5,6] i,k,j,w = [0,2,3,6] # 先保存需要交换的两个子列表 sub_front = A[i:k] sub_back = A[j:w] # 删除原列表中后段子列表的部分 del A[j:w] # 将后段子列表替换到前段位置 A[i:k] = sub_back # 将前段子列表追加到末尾 A.extend(sub_front) print(A) # 输出: [4,5,6,3,1,2]
为什么原代码会出错?
原代码执行时,Python会先计算右侧的两个切片值(A[j:w]得到[4,5,6],A[i:k]得到[1,2]),然后依次执行左侧的赋值:
- 首先将
A[i:k](即A[0:2])替换为[4,5,6],此时列表变为[4,5,6,3,4,5,6](长度从6变为7); - 接着将
A[j:w](即A[3:6])替换为[1,2],这会把列表中索引3到5的元素[3,4,5]替换成[1,2],最终得到[4,5,6,1,2,6],也就是你看到的重复6和丢失3的结果。
内容的提问来源于stack exchange,提问作者FG85
相关产品推荐
相关产品推荐

