Python 中的列表(list)里初、元組(tuple)和字符串(str)等序列類型都支持切片操作。
1 最后一個元素設(shè)計
切片操作時不會包含區(qū)間范圍中的最后一個元素忽舟,因?yàn)?Python 與 Java 語言一樣双妨,以 0 作為起始下標(biāo)。這樣做的好處是:
- 當(dāng)看見
[:x]
語法時叮阅,就可以知曉切片內(nèi)包含 x 個元素刁品。 - 當(dāng)看見
[start:stop]
語法時,就可以知曉切片內(nèi)包含 stop-start 個元素浩姥。 - 通過一個下標(biāo)就可以把序列分割成不重疊的兩部分挑随,形如
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])
運(yùn)行結(jié)果:
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 值如果為負(fù)兜挨,則會進(jìn)行反向取值。
s='python'
logging.info('s[::3] -> %s',s[::3])
logging.info('s[::-1] -> %s',s[::-1])
logging.info('s[::-2] -> %s',s[::-2])
運(yùn)行結(jié)果:
INFO - s[::3] -> ph
INFO - s[::-1] -> nohtyp
INFO - s[::-2] -> nhy
3 操作切片
把切片放在賦值語句的左邊眯分,就可以直接修改序列拌汇。如果把它作為 del 操作的對象,我們就可以對序列進(jìn)行切除操作弊决。
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
運(yùn)行結(jié)果:
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
如果賦值的對象是一個切片噪舀,那么它必須是個可迭代對象。即便只有一個值飘诗,也必須要把它轉(zhuǎn)換成可迭代的序列与倡。比如示例中的最后一個例子直接把 100 賦值給 l[2:5]
,Python 就會拋出 TypeError: can only assign an iterable 錯誤昆稿。