用可迭代的替换切片

Replacing slice by an iterable

我有一个列表 s,如下所示:

s = [1, 2, 3]

我正在使用以下代码替换 slice of 's'

s[1:4] = [22, 3, 4, 5, 6, 7]
print(s)

输出: [1, 22, 3, 4, 5, 6, 7]

我的理解s[1:4]应该只替换3 elementsstarting from 1st elementup to but not including 4th element.

假设输出: [1, 22, 3, 4]

所以让我们使用一个更好的例子。我已将输出作为注释代码包含在代码片段中

s = list(range(1, 11))
print(f"Len = {len(s)} | S = {s}")

# Len = 10 | S = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

有3种情况:

情况一:分配的列表比索引范围短

s = list(range(1, 11))
s[1:4] = [0, 0]
print(f"Len = {len(s)} | S = {s}")

# Len = 9 | S = [1, 0, 0, 5, 6, 7, 8, 9, 10]

回答:列表大小缩小了 1,因为只有 2 个项目被分配到 3 个地方。

情况2:分配的列表比索引范围长

s = list(range(1, 11))
s[1:4] = [0, 0, 0, 0, 0, 0, 0]
print(f"Len = {len(s)} | S = {s}")

# Len = 14 | S = [1, 0, 0, 0, 0, 0, 0, 0, 5, 6, 7, 8, 9, 10]

答案:列表大小增加了 4,因为 7 个项目被分配到 3 个地方。

情况 3:分配的列表等于索引范围

s = list(range(1, 11))
s[1:4] = [0, 0, 0]
print(f"Len = {len(s)} | S = {s}")

# Len = 10 | S = [1, 0, 0, 0, 5, 6, 7, 8, 9, 10]

答案: 在这种情况下,它将被正确替换,因为两个尺寸匹配。

结论

  • Python 似乎正在缩小和扩大列表以容纳分配的项目。
  • 无论big/small分配的列表如何,切片索引之外的所有元素都不会受到影响。

更新

正如@mealhour 所指出的,在第四种情况下,您可以将步长增加到大于 1,并将其分配给列表中的第 k 个项目。在这种情况下,大小必须匹配,否则 python 会抛出错误。这个解释的真好

s = list(range(1, 11))
# s[1:4:2] = [0, 0, 0] <- This throws an error
s[1:4:2] = [0, 0]
print(f"Len = {len(s)} | S = {s}")

# Len = 10 | S = [1, 0, 3, 0, 5, 6, 7, 8, 9, 10]
s = [1,2,3]
x = [22,3,4,5,6]
j = 0
for i in range(1,4):
    try:
        s[i] = x[j]
    except IndexError:
        s.append(x[j])
    j +=1

您可以使用类似的方法来实现您的目标