a = [0,1,2,3,4,5]
a[-3:] -> [3,4,5]
a[-3:-1] -> [3, 4]
sequence를 여러 조각으로 나누는 구문
어떤 파이썬 class에도 slicing을 추가할 수 있다.
__getitem__
과 __setitem__
특별 method를 구현하면 된다.slicing 할 때, 리스트의 index 범위를 넘어가는 시작과 끝 index는 조용히 무시된다.
리스트(a)를 slicing 한 결과(=b) 는 완전히 새로운 리스트이며, b은 a에 대한 참조를 그대로 유지한다. b을 변경해도 a는 바뀌지 않는다.
a = [0,1,2,3,4,5]
b = a[3:] # [3, 4, 5]
b[1] = 99 # [3, 99, 5]
a -> [0, 1, 2, 3, 4, 5]
b -> [3, 99, 5]
a = [0,1,2,3,4,5]
a[2:3] = [10,11,12]
a -> [0, 1, 10, 11, 12, 3, 4, 5]
list[시작:끝:증가값]
으로 일정한 간격을 두고 slicing 할 수 있다.itertools
내장 모듈의 islice 메서드
를 사용하라.car_ages = [0, 9, 4, 8, 7, 20, 19, 1, 6, 15]
car_ages_descending = sorted(car_ages, reverse=True)
# 권장하는 코드
oldest, second_oldest, *others = car_ages_descending
oldest, *others, youngest = car_ages_descending
*others, second_youngest, youngest = car_ages_descending
# 아래와 같이 하면 안된다.
oldest = car_ages_descending[0]
second_oldest = car_ages_descending[1]
others = car_ages_descending[2:]
# 아래와 같은 구문은 돌아가지 않는다. (Error)
*others = car_ages_descending
#first, *middle, *second_middle, last = [1, 2, 3, 4] (2개 이상 안됨)
# 아래는 * 가 2개지만, *이 서로 다른 부분에 포함되어 돌아간다.
car_inventory = {
'시내': ('그랜저', '아반테', '티코'),
'공항': ('제네시스 쿠페', '소나타', 'K5', '악센트'),
}
((loc1, (best1, *rest1)),
(loc2, (best2, *rest2))) = car_inventory.items()