用可迭代的替换切片



我有一个列表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]

有三种情况:

情况1:分配的列表短于索引范围

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]

答案:由于只有2个项目被分配到3个位置,因此列表大小缩小了1。

情况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]

答案:由于7个项目被分配到3个位置,因此列表大小增加了4。

情况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似乎在缩小和扩大列表以容纳分配的项
  • 无论分配的列表有多大/多小,切片索引之外的所有元素都不会受到影响

更新

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

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

你可以用这样的东西来实现你的目标

最新更新