我有一个列表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 elements
starting from 1st element
和up 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
你可以用这样的东西来实现你的目标