使用负索引调整大小的列表切片分配
List slice assignment with resize using negative indices
如果我这样做:
p=list(range(10))
p[2:6:1]=['a','b']
我得到 p=[0, 1, 'a', 'b', 6, 7, 8, 9]
,这意味着 Python 正在用新列表 ['a','b']
.
替换索引 2-5 的元素
现在什么时候,我做
p=list(range(10))
p[-2:-6:-1]=['a','b']
Python 说 ValueError: attempt to assign sequence of size 2 to extended slice of size 4
为什么在第一种情况下会调整列表的大小,而在第二种情况下不会?
我不知道 python 列表切片的确切内部工作原理,但这可能与 p[-2:-6:-1]
在列表中向后而不是向前工作这一事实有关。
如果您想要快速修复,请使用:
p[-6:-2:1] = ['a', 'b']
这样,您将再次从 'left to right' 开始工作。
这是 扩展 切片的预期行为。正如您所发现的,它需要将相同数量的元素分配给切片。这里是 documentation 提到的问题。
如果改为切片 p[1:5:2]
,原因就更明显了。这不是一个很好的连续块,您可以轻松调整大小。
p[2:6:1]
有效,因为它本质上是一个常规切片,即 p[2:6]
.
根据 documentation,对常规切片(您的第一个切片)的赋值可用于更改序列的长度,而扩展切片则不那么灵活。
分配给扩展切片时,语句右侧的列表必须包含与其要替换的切片相同数量的项目。
可能是因为 ['a'、'b'] 向前传播,但您对“-1”的索引迫使它向后传播。
您可以使用以下方法进行同样的操作:
p[-6:-2:1] = ['a', 'b']
但是如果你想将长度从 10 增加到 12,你可以试试这个:
p[-2:-6:1]=['a','b']
或:
p[-2:-6]=['a','b']
这两个都会给出:
[0, 1, 2, 3, 4, 5, 6, 7, 'a', 'b', 8, 9]
如果我这样做:
p=list(range(10))
p[2:6:1]=['a','b']
我得到 p=[0, 1, 'a', 'b', 6, 7, 8, 9]
,这意味着 Python 正在用新列表 ['a','b']
.
现在什么时候,我做
p=list(range(10))
p[-2:-6:-1]=['a','b']
Python 说 ValueError: attempt to assign sequence of size 2 to extended slice of size 4
为什么在第一种情况下会调整列表的大小,而在第二种情况下不会?
我不知道 python 列表切片的确切内部工作原理,但这可能与 p[-2:-6:-1]
在列表中向后而不是向前工作这一事实有关。
如果您想要快速修复,请使用:
p[-6:-2:1] = ['a', 'b']
这样,您将再次从 'left to right' 开始工作。
这是 扩展 切片的预期行为。正如您所发现的,它需要将相同数量的元素分配给切片。这里是 documentation 提到的问题。
如果改为切片 p[1:5:2]
,原因就更明显了。这不是一个很好的连续块,您可以轻松调整大小。
p[2:6:1]
有效,因为它本质上是一个常规切片,即 p[2:6]
.
根据 documentation,对常规切片(您的第一个切片)的赋值可用于更改序列的长度,而扩展切片则不那么灵活。
分配给扩展切片时,语句右侧的列表必须包含与其要替换的切片相同数量的项目。
可能是因为 ['a'、'b'] 向前传播,但您对“-1”的索引迫使它向后传播。
您可以使用以下方法进行同样的操作:
p[-6:-2:1] = ['a', 'b']
但是如果你想将长度从 10 增加到 12,你可以试试这个:
p[-2:-6:1]=['a','b']
或:
p[-2:-6]=['a','b']
这两个都会给出:
[0, 1, 2, 3, 4, 5, 6, 7, 'a', 'b', 8, 9]