我首先通過 input() 函式,接收了外部輸入字串,然後通過 list 函式的切片,實現了迴文數 程式碼如下:
s = input()
if s == s[::-1]:
print('True')
else:
print('False')
複製程式碼
結果:adfe False
什麼是切片列表?
python中的有序序列都支援切片,不是列表專屬的,切片的返回結果型別和切片物件型別一致,返回的是切片物件的子序列,如:對一個列表切片返回一個列表,字串切片返回字串。切片生成的子序列元素是源版的拷貝。因此切片是一種淺拷貝。
切片的圖示分析
li=["A","B","C","D"]
# 格式:li[start : end : step]
# start 是切片起點索引,end 是切片終點索引,但切片結果不包括終點索引的值。step 是步長預設是 1。
# [start : end : step) 左開右閉
t = li[0:3]
t1 = li[2:]
t2 = li[1:3]
t3 = li[0:4:2]
print(t)
print(t1)
print(t2)
print(t3)
複製程式碼
在 step 的符號一定的情況下,start 和 end 可以混合使用正向和反向索引,無論怎樣,你都要保證
start 和 end 之間有和 step 方向一致元素間隔,否則會切出空列表。
eg:
t=li[0:2] t=li[0:-2] t=li[-4:-2] t=li[-4:2]上面的結果都是一樣的:t 為 ["A","B"]。
eg2:
t=li[-1:-3:-1] t=li[-1:1:-1] t=li[3:1:-1] t=li[3:-3:-1]
上面的結果都是一樣的:t 為 ["D","C"]。 eg3: t=li[-1:-3] t=li[-1:1] t=li[3:1] t=li[3:-3]
eg3:
t=li[-1:-3] t=li[-1:1] t=li[3:1] t=li[3:-3]
都切出空列表。
同時,step 的正負決定了切片結果的元素採集的先後。 省略 start 和 end 表示以原列表全部為目標。 t=li[::-1] t--->["C","B","A"] #反向切,切出全部。 t=li[:] t--->["A","B","C","D"] #正向切全部。
切片原理
列表切片產生的是列表的副本,與原列表不是同一份空間。
x = [1,2,3]
y =x[:]
x[0] = -1
print(y)
print(x)
複製程式碼
結果:[1, 2, 3] [-1, 2, 3]
列表寫操作
在2後面插入若干個元素,應該用列表
x = [1,2,3,4,5]
x[0:2] = [100]
x
#代表在0到2區間插入100
結果:[100, 3, 4, 5]
複製程式碼
x = [1,2,3,4,5]
x[2:4]=[None]
x
#結果:[1, 2, None, 5]
複製程式碼
刪除切片
>>> del x[2:3] #刪除切片
>>> x
[1, 2, 3, 4, 5]
複製程式碼
對於切片x[from:to],會進行預處理to=max(from+1,to)
x=[1,2,3,4,5]
x[2:1]=[100]
x
#結果:[1, 2, 100, 3, 4, 5]
複製程式碼
對於切片del操作,如果from>to,不執行任何操作
x=[1,2,3,4,5]
del x[2:0]
x
#結果:[1, 2, 3, 4, 5]
del x[2:3]
x
#結果:[1, 2, 4, 5]
複製程式碼
切片原理解析
通過指定下標的方式來獲得某一個資料元素,或者通過指定下標範圍來獲得一組序列的元素,這種訪問序列的方式叫做切片。有些地方也把它稱之為分片。
先從底層分析切片運算:
list 的切片,內部是呼叫 getitem,setitem,delitem 和 slice 函式。而 slice 函式又是和 range() 函式相關的。 給切片傳遞的鍵是一個特殊的 slice 物件。該物件擁有可描述所請求切片方位的屬性
a = [1,2,3,4,5,6]
x = a [ 1 : 5 ] # x = a.__getitem__(slice( 1, 5, None))
a [ 1 : 3 ] = [10, 11, 12 ] # a.__setitem__(slice(1, 3, None), [ 10, 11, 12 ])
del a [ 1 : 4 ] # a.__delitem__(slice(1, 4, None))
複製程式碼
看看程式碼具體實現
def between(beg, end, mid):
# 判斷mid是否位於begin和end之間
return end > mid >= beg or end < mid <= beg
def get_slice(a, beg, end, delta=1):
# 陣列切片get方式
if delta == 0:
raise ValueError("slice step cannot be 0")
# 將負數下標轉化一下
if beg < 0:
beg += len(a)
if end < 0:
end += len(a)
# 如果轉化完成之後依然不在合法範圍內,則返回空列表
if beg < 0 and end < 0 or beg >= len(a) and end >= len(a):
return []
# 如果方向不同,則返回空列表
if (end - beg) * delta <= 0:
return []
# 將越界的部分進行裁剪
beg = max(0, min(beg, len(a) - 1))
end = max(-1, min(end, len(a)))
ans = []
i = beg
while between(beg, end, i):
ans.append(a[i])
i += delta
return ans
def set_slice(a, li, beg, end, delta=1):
if delta == 0:
raise ValueError("slice step cannot be 0")
if delta == 1:
# 如果delta==1,那麼li的長度可以隨意
if beg < 0:
beg += len(a)
if end < 0:
end += len(a)
beg = max(0, min(beg, len(a) - 1))
end = max(-1, min(end, len(a)))
for i in range(beg, end):
del a[beg]
for i in reversed(li):
a.insert(beg, i)
else:
# delta!=1,相當於替換
if len(get_slice(a, beg, end, delta)) != len(li):
raise ValueError("array don't match")
if len(li) == 0:
return
if beg < 0:
beg += len(a)
if end < 0:
end += len(a)
beg = max(0, min(beg, len(a) - 1))
# 用li中的全部元素逐一替換
for ind, value in enumerate(li):
a[ind * delta + beg] = value
複製程式碼
注:本文根據其它文章練習稍加改動,下面是出處 連結:juejin.im/post/5b5a0c…