概述
在Python中,字串是定義為字元的有序集合,即我們可以像使用列表一樣在字串中自由翱翔-使用索引和切片操作字串,比如通過指定的索引獲取字串某個位置的字元。
# 示例字串
s = 'python str with slice'
複製程式碼
索引的簡單使用
在Python中字串的索引可以是正數,正數即從左向右索引,索引從0開始,也可以是負數,負數即從右向左開始索引,索引從-1開始。如果超出了正負的索引範圍,則會丟擲異常
# 即從左邊獲取第一個偏移位置的字元
print(s[0])
# 即從左邊獲取第一個偏移位置的字元
print(s[-1])
# 即從左邊獲取第三個偏移位置的字元
print(s[4])
try:
# 嘗試不存在於s的索引
print(s[1000])
except:
print('IndexError: string index out of range')
複製程式碼
示例結果:
p
e
o
IndexError: string index out of range
複製程式碼
切片的簡單使用
切片,顧名思義即將一個有序序列切出一片,即從一個完整的字串中取出一部分字串,而怎麼取? 這就取決於我們怎麼利用索引進行切片了:
s = 'python str with slice'
# 獲取從偏移為1,直到但不包括偏移為6的元素
print(s[0:6])
# 獲取從偏移為7,直到但不包括偏移為10的元素
print(s[7:10])
# 獲取從偏移為11,直到但不包括偏移為-6的元素
print(s[11:-6])
複製程式碼
示例結果:
python
str
with
複製程式碼
通過上面的切片效果,我們可以看到切片的基本使用,即通過兩個用冒號隔開的索引完成“切片”操作,並返回新的字串(記住,就算只“切”了一個字元,在Python中單個字元也是作為字串的存在,這和類C中是不一樣的)
更酷一點的切片
# 示例字串
s = 'python str with slice'
# 獲取偏移為16直到末尾的元素,等價於獲取偏移為16直到但不包括偏移為序列長度的元素
print(s[16:])
# 獲取從偏移為0,直到但不包含偏移為11的元素
print(s[:11])
# 獲取偏移為-5直到末尾的元素,等價於獲取偏移為16直到但不包括偏移為序列長度的元素
print(s[-5:])
# 獲取從偏移為0,直到但不包含偏移為-11的元素
print(s[:-11])
# 獲取從偏移為0,知道末尾的元素,實現了有效的底層s複製。
print(s[:])
複製程式碼
示例效果:
slice
python str
slice
python str
python str with slice
複製程式碼
頂層賦值小技巧
對於最後一個示例,即s[:]
,對於可變物件的複製是很有用處的,比如列表,當我們想要複製列表時:
ls1 = [1, 2, 3, 4, 5]
ls2 = ls1
ls2[0] = 100
print(ls1)
複製程式碼
示例結果
[100, 2, 3, 4, 5]
複製程式碼
我們看到執行結果,對於可變物件的複製,通過ls2 = ls1
其實類似C中將指向ls1的指標賦值給ls2,即還是指向了同一記憶體空間,所以在操作ls2時,ls1也同時發生了變化,本質就是在操作同一記憶體空間
而通過s[:]
可以實現新的記憶體分配,完整的賦值一份新的資料,使ls2指向新的記憶體空間:
ls1 = [1, 2, 3, 4, 5]
ls2 = ls1[:]
ls2[0] = 100
print(ls1)
複製程式碼
示例結果
[1, 2, 3, 4, 5]
複製程式碼
更更酷一點的切片
在切片的使用中還可以再新增一個可選擇的索引引數:
s = 'abcdefghijk'
# 偏移從0開始,直到不含偏移量為11,每隔2個元素索引一次構成最終的新字串
print(s[:11:2])
# 偏移從11開始,直到不含偏移量為0,每隔2個元素索引一次構成最終的新字串
print(s[11::-2])
# 即從右向左,每隔一個元素索引一次,效果即翻轉字串
print(s[::-1])
複製程式碼
示例結果:
acegik
kigeca
複製程式碼
字串翻轉小技巧
當我們想要翻轉一個字串時會怎麼做? 用迴圈? reverse? 棧? reduce? 使用s[::-1]
即可完成字串翻轉的操作。
總結
切片在Python中的使用實在太頻繁,且用起來非常順手,所以不得不提出來說說,比如在讀取文字中的行時,需要清除每行的換行符直接line[:-1]
,還有比如在leetcode 有一題:
leetcode題例
實現 strStr() 函式。
給定一個 haystack 字串和一個 needle 字串,在 haystack 字串中找出 needle 字串出現的第一個位置 (從0開始)。如果不存在,則返回 -1。
示例 1:
輸入: haystack = "hello", needle = "ll"
輸出: 2
示例 2:
輸入: haystack = "aaaaa", needle = "bba"
輸出: -1
說明:
當 needle 是空字串時,我們應當返回什麼值呢?這是一個在面試中很好的問題。
對於本題而言,當 needle 是空字串時我們應當返回 0 。這與C語言的 strstr() 以及 Java的 indexOf() 定義相符。
複製程式碼
利用切片解題:
class Solution:
def strStr(self, haystack: str, needle: str) -> int:
if needle:
length_h = len(haystack)
length_n = len(needle)
for i in range(length_h):
if haystack[i:i+length_n] == needle:
return i
return -1
else:
return 0
複製程式碼