使用切片交换索引?

Swap indexes using slices?

我知道您可以在 Python

中交换 2 个单一索引
r = ['1', '2', '3', '4', '5', '6', '7', '8'] 
r[2], r[4] = r[4], r[2]

输出:

['1', '2', '5', '4', '3', '6', '7', '8']

但为什么不能在 python 中交换 2 个索引片?

r = ['1', '2', '3', '4', '5', '6', '7', '8'] 

我想将 r 中的数字 3 + 4 与 5 + 6 + 7 交换:

r[2:4], r[4:7] = r[4:7], r[2:4]

输出:

['1', '2', '5', '6', '3', '4', '7', '8']

预期输出:

['1', '2', '5', '6', '7', '3', '4', '8']

我做错了什么? 输出:

想想这个:

r[2:4], r[4:7] = r[4:7], r[2:4]

与此类似:

original_r = list(r)
r[2:4] = original_r[4:7]
r[4:7] = original_r[2:4]

因此,当它到达第三行时,第 4 个元素不再是您认为的那样...您将 '3', '4' 替换为 '5', '6', '7',现在[4:7] 切片以 '7'.

开头
>>> r = ['1', '2', '3', '4', '5', '6', '7', '8']
>>> r[2:5], r[5:7] = r[4:7], r[2:4]
>>> r
['1', '2', '5', '6', '7', '3', '4', '8']

在您的代码中:

>>> r[2:4], r[4:7] = r[4:7], r[2:4]

您正在将具有 3 个元素的 r[4:7] 分配给只有 2 个元素的 r[2:4]

在我发布的代码中:

>>> >>> r[2:5], r[5:7] = r[4:7], r[2:4]

r[4:7]['5', '6', '7'],替换 r[2:5]['3', '4', '5']

r 导致 ['1', '2', '5', '6', '7', '6', '7', '8']

然后:

r[2:4] 替换为 ['3', '4'] r[5:7]['6', '7']

所以最终结果是:

['1', '2', '5', '6', '7', '3', '4', '8']

切片工作正常。您正在替换不同长度的切片。 r[2:4]是两项,r[4:7]是三项。

>>> r = ['1', '2', '3', '4', '5', '6', '7', '8']
>>> r[2:4]
['3', '4']
>>> r[4:7]
['5', '6', '7']

所以当['3', '4']被替换时,只能得到['5', '6'],而当['5', '6', '7']被替换时,只能得到['3', '4']。所以你有 ['1', '2',,接下来的两个元素是 ['5', '6', '7'] 的前两个元素,也就是 ['5', '6',然后是 ['3', '4' 的两个元素,然后是剩余的'7', '8'].

如果要替换切片,必须在正确的位置开始切片,并在数组中为每个切片分配适当的大小:

>>> r = ['1', '2', '3', '4', '5', '6', '7', '8']
>>> r[2:5], r[5:7] = r[4:7], r[2:4]
>>> r
['1', '2', '5', '6', '7', '3', '4', '8']
 old index: 4    5    6    2    3
 new index: 2    3    4    5    6