使用切片交换索引?

时间:2016-04-30 08:21:57

标签: python python-3.x indexing slice swap

我知道你可以在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']

我错了什么? 输出:

3 个答案:

答案 0 :(得分:1)

想一想:

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'开头。

答案 1 :(得分:1)

>>> 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]

您要将r[4:7]分配给r[2:4]只有2个的3个元素。

在我发布的代码中:

>>> >>> 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']

所以最后的结果是:

1 APPLE
2 BANANA

DOWN:

1 ORANGE
6 GRAPES

答案 2 :(得分:1)

切片工作正常。您正在更换不同长度的切片。 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