python3切片使用方法及一些技巧介紹+leetcode題例

若數發表於2019-05-07

概述

在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
            
複製程式碼

相關文章