我对 python 中的列表切片有疑问

问题描述 投票:0回答:2

例1中,L[0:2:1]可以用[99,99,99,99,99]赋值

# example1:
L = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
L[0:2:1] = [99,99,99,99,99]
print(L)

#output: [99, 99, 99, 99, 99, 2, 3, 4, 5, 6, 7, 8, 9]

但是 example2,L[-1:-2:-1] 不能通过 [99,99,99,99,99] 分配

# example2:
L = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
L[-1:-2:-1] = [99,99,99,99,99]
print(L)

#ValueError: attempt to assign sequence of size 5 to extended slice of size 1

不明白为什么L[-1:-2:-1]不能按[99,99,99,99,99]赋值

python list slice
2个回答
0
投票

使用切片赋值对正数和负数都有效。但是您需要为切片产生的项目数分配正确的序列长度:

L = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
L[1:5:2] = [99, 99]
print(L)   # [0, 99, 2, 99, 4, 5, 6, 7, 8, 9]
L[1:5:2] = [99, 99, 99]  # ValueError: attempt to assign sequence of size 3 to extended slice of size 2

或否定:

L = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
L[-2:-4:-1] = [99, 99]
print(L)   # [0, 1, 2, 3, 4, 5, 6, 99, 99, 9]
L[-2:-4:-1] = [99, 99, 99]  # ValueError: attempt to assign sequence of size 3 to extended slice of size 2

该规则的例外情况是切片步长为 1(或省略,因为默认为 1)。然后匹配的切片被删除并替换为分配给它的任何内容。

L = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
L[1:9] = [99]
print(L)  # [0, 99, 9]

0
投票

在您的第二个示例中,

L[-1:-2:-1]
指的是从索引 -1 开始到索引 -2 结束的切片,步长为 -1,这意味着它选择列表的最后一个元素。因此,切片
L[-1:-2:-1]
只包含一个元素。

要将值

[99,99,99,99,99]
分配给列表的最后一个元素,您可以使用
L[-1:]
而不是
L[-1:-2:-1]

L = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
L[-1:] = [99,99,99,99,99]
print(L)

返回:

[0, 1, 2, 3, 4, 5, 6, 7, 8, 99, 99, 99, 99, 99]
© www.soinside.com 2019 - 2024. All rights reserved.