记录博客 ZH-BLOG

Python 对象切片

时间:2018-07-30 11:42:04分类:python
对对象进行切片

s[a:b:c] 的形式对 s 在 a 和 b 之间以 c 为间隔取值。 c 的值还可以为负, 负值意味着反向取值。

>>> s = 'bicycle'
>>> s[::3]
'bye'
>>> s[::-1]
'elcycib'
>>> s[::-2]
'eccb'

前面取出卡牌中所有 'A'

>>> deck[12::13]
[Card(rank='A', suit='spades'), Card(rank='A', suit='diamonds'),
Card(rank='A', suit='clubs'), Card(rank='A', suit='hearts')]

对 seq[start:stop:step] 进行求值的时候, Python 实际会调用 seq.__getitem__(slice(start, stop, step))。用 [] 中来返回一个切片对象。

纯格式化文本的切片:

# a:b:c 这种用法只能作为索引或者下标用在 [] 中来返回一个切片对象:
# slice(a, b, c)。
# 对seq[start:stop:step] 进行求值的时候, Python 会调用
# seq.__getitem__(slice(start, stop, step))。

# 使用切片对象
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])

切片赋值

l=list(range(10))
print(l) # [0,1,2,3,4,5,6,7,8,9]
print(l[2:5]) # [2,3,4]
l[2:5]=[11,12,13]
print(l) # [0,1,11,12,13,5,6,7,8,9]
del l[2:5]
print(l) # [0,1,5,6,7,8,9]
print(l[3::2]) # [6,8]
l[3::2]=[100,99]
print(l) # [0,1,5,100,7,99,9]
# l[3::2]=88 TypeError: must assign iterable to extended slice
# l[3::2]=[88]    #ValueError: attempt to assign sequence of size 1 to extended slice of size 2
# 如果赋值的对象是一个切片, 那么赋值语句的右侧必须是个可迭代
# 对象。 即便只有单独一个值, 也要把它转换成可迭代的序列。
l[0]=123
l[3:]=[88]  # [88]可替换连续多个值
print(l)
l[1:]=[]    # 保留第一个元素,删除其余元素
print(l)