Slicing
source:fluent pythoon 2nd edition
对于python中的list tuple str以及所有的sequence 类型来说,一个common feature就是sclice,它可能远比你现在知道的强大。
在本节,我们会介绍slice高级形式的使用。至于用户自定义的实现类,我们将在Chapter 12 介绍,先学会现成的再去学自定义的。
为什么slice和range会排除最后一个item
Python排除slice和range最后一个元素的习惯做法,其实与python c 或者其他语言中index 都从0开始有关:
- 当只给定stop position时,可以清楚地看到slice或range的长度:range(3) 和 my_list[:3]都产生3个item
- 当start position和end position都存在时,很容易计算出slice或range的长度,即stop - start
- 很方便的将sequence分为两部分,如my_list[:x]以及my_list[x:]
Slice Objects
用三个列子再来介绍下s[a:b:c]
>>> s = 'bicycle'
>>> s[::3]
'bye'
>>> s[::-1]
'elcycib'
>>> s[::-2]
'eccb
对于[a:b:c],python会产生一个slice对象:slice(a,b,c),python会调用seq.getitem(slice(start,step,stop))方法。
下面给出了一个例子,你可以为slice命名。
>>> invoice = """
... 0.....6.................................40........52...55........
... 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')[2:]
>>> 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
Assigning to Slices
可变的sequence使用slice可以被嫁接、删除、修改。如下面例子所示
>>> 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
[0, 1, 20, 11, 5, 22, 9]
>>> l[2:5] = 100
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: can only assign an iterable
>>> l[2:5] = [100]
>>> l
[0, 1, 100, 22, 9]
请注意,当赋值的目标是slice时,右边所要赋的值必须是iterable的对象。