用可迭代的替换切片
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 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]
有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
您可以使用类似的方法来实现您的目标
我有一个列表 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]
有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
您可以使用类似的方法来实现您的目标