提问人:Đặng Khánh 提问时间:3/19/2023 更新时间:3/19/2023 访问量:67
我在 Python 中对列表切片有问题
i have a problem with list slicing in python
问:
在示例 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]
但例2,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] 分配
答:
0赞
Jules SJ
3/19/2023
#1
使用切片分配值适用于正数和负数。但是,您需要为切片生成的项数分配正确的序列长度:
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赞
Đặng Khánh
3/19/2023
你能向我解释一下“当切片步骤为 1(或省略为 1 是默认值)时。然后,匹配的切片将被移除,并替换为分配给它的任何内容。它是由于 python 中的某个功能而起作用的,还是基于某种原理
0赞
Jules SJ
3/19/2023
我还没有看到任何这方面的文档,但我认为这是一个使切片分配更加强大和灵活的功能。当步长为 1 时,python 很容易解释设置不同长度序列的含义(替换两个索引之间的所有内容)。但是,当步骤不是 1 时,很难实现一致且可预测的替换。
0赞
Serge de Gosson de Varennes
3/19/2023
#2
在 scond 示例中,指的是从索引 -1 开始到索引 -2 结束的切片,步长为 -1,这意味着它选择列表的最后一个元素。因此,切片仅包含一个元素。L[-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]
评论