使用负索引调整大小的列表切片分配[重复]

Posted

技术标签:

【中文标题】使用负索引调整大小的列表切片分配[重复]【英文标题】:List slice assignment with resize using negative indices [duplicate] 【发布时间】:2020-10-17 02:35:16 【问题描述】:

如果我这样做:

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

为什么它在第一种情况下调整列表大小而不是第二种情况?

【问题讨论】:

【参考方案1】:

这是 扩展 切片的预期行为。正如您所发现的,它需要将相同数量的元素分配给切片。这里是documentation,指的是这个问题。

如果改为切片p[1:5:2],原因变得更加明显。这不是一个可以轻松调整大小的连续块。

p[2:6:1] 之所以有效,是因为它本质上是一个常规切片,即p[2:6]

【讨论】:

那么步幅不等于 1 的切片是扩展切片吗? 没错!【参考方案2】:

我不知道 python 列表切片的确切内部工作原理,但这可能与p[-2:-6:-1] 在列表中向后而不是向前工作这一事实有关。

如果您想快速修复,请使用: p[-6:-2:1] = ['a', 'b']

这样,您将再次从“左到右”工作。

【讨论】:

【参考方案3】:

根据documentation,分配给常规切片(您的第一个)可用于更改序列的长度,而扩展切片则不灵活。

分配给扩展切片时,语句右侧的列表必须包含与其要替换的切片相同数量的项目。

【讨论】:

【参考方案4】:

可能是因为 ['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]

【讨论】:

以上是关于使用负索引调整大小的列表切片分配[重复]的主要内容,如果未能解决你的问题,请参考以下文章

C# 数据结构,可以动态调整大小到给定限制的列表,并允许快速访问任何索引

为啥我的列表框没有调整大小? (动态调整对话框组件的大小)

如何调整动态分配的多态对象数组的大小?

按索引调整数组大小

使用 CSS 调整换行文本的大小 [重复]

在将图像分配给 img 标签之前使用 javascript 调整图像大小