我有一個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]
uj5u.com熱心網友回復:
所以讓我們用一個更好的例子。我已將輸出作為注釋掉的代碼包含在代碼片段中
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種情況:
情況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]
Ans :串列大小縮小了 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]
Ans :由于 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]
Ans :在這種情況下,它將被正確替換,因為兩個尺寸都匹配。
結論
- Python 似乎正在縮小和擴大串列以容納分配的專案。
- 無論分配的串列有多大/多小,切片索引之外的所有元素都不會受到影響。
更新
正如@mealhour 所指出的,在第四種情況下,您可以將步長增加到大于 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]
uj5u.com熱心網友回復:
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
你可以使用這樣的東西來實作你的目標
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/445771.html
標籤:Python python-3.x 列表 片
上一篇:為什么這個函式會覆寫我的串列?
