1. 程式人生 > 實用技巧 >Python 切片的高階用法

Python 切片的高階用法

Python 中的列表(list)、元組(tuple)和字串(str)等序列型別都支援切片操作。

1 最後一個元素設計

切片操作時不會包含區間範圍中的最後一個元素,因為 Python 與 Java 語言一樣,以 0 作為起始下標。這樣做的好處是:

  • 當看見[:x]語法時,就可以知曉切片內包含 x 個元素。

  • 當看見 [start:stop]語法時,就可以知曉切片內包含 stop-start 個元素。

  • 通過一個下標就可以把序列分割成不重疊的兩部分,形如 my_list[:x] (範圍為 0 ~ x-1)和 my_list[x:] (範圍為 x ~ len-1)。

    l=[10, 20, 30, 40, 50, 60]
    logging.info('l[:2] -> %s',l[:2])
    logging.info('l[2:] -> %s',l[2:])
    logging.info('l[:3] -> %s',l[:3])
    logging.info('l[3:] -> %s',l[3:])
    logging.info('l[1:2] -> %s',l[1:2])
    複製程式碼
執行結果:
複製程式碼

INFO - l[:2] -> [10, 20] INFO - l[2:] -> [30, 40, 50, 60] INFO - l[:3] -> [10, 20, 30] INFO - l[3:] -> [40, 50, 60] INFO - l[1:2] -> [20]


## 2 按間隔切片

我們還可以用  `s [ a : b : c ] `的語法對 s 中的在 a 和 b 之間的元素以 c 為間隔切片。 c 值如果為負,則會進行反向取值。

複製程式碼

s='python' logging.info('s[::3] -> %s',s[::3]) logging.info('s[::-1] -> %s',s[::-1]) logging.info('s[::-2] -> %s',s[::-2])

執行結果:
複製程式碼

INFO - s[::3] -> ph INFO - s[::-1] -> nohtyp INFO - s[::-2] -> nhy


## 3 操作切片


把切片放在賦值語句的左邊,就可以直接修改序列。如果把它作為 del 操作的物件,我們就可以對序列進行切除操作。

Luciano Ramalho 舉了這樣一個示例:

複製程式碼

l=list(range(10)) logging.info('l -> %s',l) l[2:5]=[20,30] logging.info('l -> %s',l) del l[5:7] logging.info('l -> %s',l) l[3::2]=[11,22] logging.info('l -> %s',l) l[2:5]=[100] logging.info('l -> %s',l) l[2:5]=100

執行結果:
複製程式碼

INFO - l -> [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] INFO - l -> [0, 1, 20, 30, 5, 6, 7, 8, 9] INFO - l -> [0, 1, 20, 30, 5, 8, 9] INFO - l -> [0, 1, 20, 11, 5, 22, 9] INFO - l -> [0, 1, 100, 22, 9] Traceback (most recent call last): ... l[2:5]=100 TypeError: can only assign an iterable


如果賦值的物件是一個切片,那麼它必須是個可迭代物件。即便只有一個值,也必須要把它轉換成可迭代的序列。比如示例中的最後一個例子直接把 100 賦值給 `l[2:5]`,Python 就會丟擲 TypeError: can only assign an iterable 錯誤。