我正在尝试在 python 中围绕给定索引旋转数组



情况1:

a=[1,2,3,4,5]
index k=2
a[:k],a[k:]=a[k:],a[:k]

当我像这样交换数组元素时。我得到了这个输出。

**OUTPUT:[3, 4, 1, 2]

案例2:

b=[1,2,3,4,5]
b[k:],b[:k]=b[:k],b[k:]

但当我像这样交换数组元素时,我得到了这个。唯一的区别是交换的顺序。

OUTPUT:[3, 4, 5, 1, 2]

如果我们交换两个变量,交换的顺序不会有什么不同。即CCD_ 1与CCD_。

为什么这在列表/数组的情况下不起作用?

在完成任何赋值之前,都会对右手边进行充分评估。随后,按从左到右的顺序执行分配。

因此,第一种情况评估为:

a[:2], a[2:] = [3, 4, 5], [1, 2]

第一个赋值将前两个元素[1, 2]替换为三个元素[3, 4, 5],所以现在我们有了a == [3, 4, 5, 3, 4, 5]。然后,第二个赋值将元素2向前替换为[1, 2],从而得到a == [3, 4, 1, 2]

在第二种情况下,我们有:

b[2:], b[:2] = [1, 2], [3, 4, 5]

第一个赋值从元素2开始用CCD_ 8替换,得到CCD_。第二个赋值用a,b=b,a0替换前两个元素,得到b == [3, 4, 5, 1, 2]

到目前为止,你可能已经注意到,这是一个很难思考的问题,有时主要是偶然发生的,所以我建议将整个事情简化为:

a[:] = a[k:] + a[:k]

如果交换两个变量,两个变量之间没有关系,那么好。您可以找到以下步骤:

>>> a=[1,2,3,4,5]
>>> k=2
>>> # a[:k], a[k:] = a[k:], a[:k]
>>> x, y = a[k:], a[:k]
>>> a[:k] = x
>>> x, a
([3, 4, 5], [3, 4, 5, 3, 4, 5])
>>> a[k:] = y
>>> y, a
([1, 2], [3, 4, 1, 2])

最新更新