python의 모든 sequence들은 slicing이 가능하다. [a:b:c] 형태로 slicing이 가능하며 c 는 건너 뛰는 step을 의미한다. 이 떄 c 는 음수 값도 가능하며, 이 경우 값을 반대로 조회한다.
s = "bicycle
s[::-1] # "elcycib"
s[::-2] # "eccb"
a:b:c 형태는 오로지 [] 안에서만 쓸 수 있다. [a:b:c] 는 slice(a, b, c) object를 생성한다. 즉 seq[a:b:c] 는 seq.__getitem__(slice(a, b, c)) 와 동일하다.
생성된 slice object에는 이름을 할당하는 것이 가능하다.
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])
[] operator는 multiple indexes 또는 comma로 구분된 slice object들을 받을 수 있다. 이 경우 __getitem__ __setitem__ 은 indices를 tuple로 받게 된다.
a[i, j] == a.__geitem__((i,j))
또한 multidiensional slicing에 대해 python에서는 Ellipsis 라는 특이한 object를 제공한다. Ellipsis 는 ... 과 동일하며 x[i, ...] 같이 쓸 수 있다. 이는 x[i, :, :, :] 와 동일한 문법이다.
Multidimensional slicing 및 Ellipsis 는 사용자 정의 sequence 를 만들 떄 유용하게 사용할 수 있다.
Luciano Ramalho, Fluent Python, 2nd Edition, O'Reilly Media, Inc., April 2022