[英]Unable to swap multiple elements in a list in python
我是 python 的新手,正在尝试创建一个函数来一次交换列表中的多个值。
def swap(deck: List[int], start1: int, end1: int, start2: int, end2: int) -> None:
start1 = start1 % len(deck)
start2 = start2 % len(deck)
end1 = end1 % len(deck)
end2 = end2 % len(deck)
if start1 < start2:
deck[start1: end1], deck[start2: end2] = deck[start2: end2], deck[start1: end1]
else:
deck[start2: end2], deck[start1: end1] = deck[start1: end1], deck[start2: end2]
当deck = [0,1,2,3,4,5,6,7,8,9,10]
swap(deck, -3, 11, 0, 2)
应该将deck变为[8,9,2,3,4,5,6,7,0,1,10]
,但我得到这个[2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 10]
我也用临时变量方法试过了
temp = deck[start1: start1]
deck[start1: start1] = deck[start2: end2]
deck[start2: end2] = temp
但我得到了相同的结果......非常感谢解释为什么会发生这种情况以及我如何解决它。
因为你的两个范围大小不一样,所以第一次分配后deck list改变了大小,所以临时内容分配的范围和原来的位置不对应。
例如:
deck = [0,1,2,3,4,5,6,7,8,9,10]
temp = deck[0:2] # temp is [0,1]
deck[0:2] = deck[-3:11] # deck is now [8, 9, 10, 2, 3, 4, 5, 6, 7, 8, 9, 10]
deck[-3:11] = temp # [8,9] is replaced by [0,1]
# because -3 is now at position 9 instead of 8
解决这个问题的一种方法(假设你的范围从不重叠)是形成甲板的 5 个切片的串联:[范围 1 之前]+[范围 2]+[范围之间]+[范围 1]+[范围 2 之后],或更多具体来说,用 3 个中间部分的串联分配总子范围
deck[start1:end2] = deck[start2:end2] + deck[end1:start2] + deck[start1:end1]
基本上,你想要做的是:
deck = deck[s2:e2] + deck[e1:s2] + deck[s1:e1]
不要尝试在等号=
前后使用两个变量。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.