在Python 里,像列表(list)、元組(tuple)和字符串(str)這類序列類型都支持切片操作,但是實際上切片操作比我們所想象的要強大很多。下面是一些切片形式的用法。
對對象進行切片
>>> s = 'bicycle'
>>> s[::3]
'bye'
>>> s[::-1]
'elcycib'
>>> s[::-2]
'eccb'
a:b:c
這種用法只能作為索引或者下標用在 [] 中來返回一個切片對象:slice(a, b, c)
。對 seq[start:stop:step]
進行求值的時候,Python 實際上會調用seq.__getitem__(slice(start, stop, step))
。
下面純文本文件形式的收據以一行字符串的形式被解析
invoice = """
1909 Pimoroni PiBrella $17.50 3 $52.50
1489 6mm Tactile Switch x20 $4.95 2 $9.90
1510 Panavise Jr. - PV-201 $28.00 1 $28.00
1601 PiTFT Mini Kit 320x240 $34.95 1 $34.95
"""
SKU = slice(0, 6)
DESCRIPTION = slice(6, 40)
UNIT_PRICE = slice(40, 52)
QUANTITY = slice(52, 55)
ITEM_TOTAL = slice(55, None)
line_items = invoice.split('\n')
for item in line_items:
print(item[UNIT_PRICE], item[DESCRIPTION])
$17.50 Pimoroni PiBrella
$4.95 6mm Tactile Switch x20
$28.00 Panavise Jr. - PV-201
$34.95 PiTFT Mini Kit 320x240
對切片賦值
如果把切片放在賦值語句的左邊,或把它作為 del 操作的對象,我們就可以對序列進行嫁接、切除或就地修改操作。
>>> l = list(range(10))
>>> l
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> l[2:5] = [20, 30]
>>> l
[0, 1, 20, 30, 5, 6, 7, 8, 9]
>>> del l[5:7]
>>> l
[0, 1, 20, 30, 5, 8, 9]
>>> l[3::2] = [11, 22]
>>> l