2. 리스트와 딕셔너리
11. 시퀀스를 슬라이싱하는 방법을 배워라
1
2
3
4
a = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h']
first_twenty = a[:20]
last_twenty = a[-20:]
# a[20] 또는 a[-20]는 에러
슬라이싱은 리스트의 인덱스 범위를 넘어가도 상관이 없다.
이를 통해 시퀀스의 최대 길이를 조절할 수 있다.
리스트를 슬라이싱 한 결과는 완전히 새로운 리스트이다.
대입에 슬라이스를 사용하면 지정한 범위에 들어있는 원소를 변경한다. 슬라이스의 길이와 대입하는 배열의 길이는 상관이 없다.
12. 스트라이드와 슬라이스를 한 식에 함께 사용하지 말라
스트라이드는 리스트[시작:끝:증가값]으로 증가값을 지정하는 것을 뜻한다.
증가값까지 활용하여 리스트를 인덱싱하면 코드 밀도가 너무 높아서 가독성이 떨어진다.
13. 슬라이싱보다는 나머지를 모두 잡아내는 언패킹을 사용하라
1
2
3
4
5
6
7
#car_ages = [0, 9, 3, 1, 2, 53, 2, 12, 9]
#first = car_ages[0]
#others = car_ages[1:-1]
#last = car_ages[-1]
first, *others, last = car_ages
#*all = car_ages 은 에러를 일으킨다.
인덱스로 인한 오류를 없앨 수 있고, 시각적 잡음이 적다.
다만 별표 식을 두 개 이상 쓸 수 없다.
14. 복잡한 기준을 사용해 정렬할 때는 key 파라미터를 사용하라
sort() 함수의 key 파라미터에 lambda 함수를 정의하여 특정한 기준으로 정렬할 수 있다.
또한 sort() 함수는 tuple의 앞의 원소부터 순차적으로 정렬의 기준점으로 삼기 때문에 이를 활용하여 여러 원소를 정렬의 기준으로 삼을 수 있다.
숫자값의 경우 - 연산을 통해 정렬 방향을 혼합할 수 있다.
파이썬은 stable sort를 지원한다. -> 다른 기준으로 여러번 sort()를 조합하여 여러가지 기준을 혼합하여 정렬을 할 수 있다.
15. 딕셔너리 삽입 순서에 의존할 때는 조심하라
16. in을 사용하고 딕셔너리 키가 없을 때 KeyError를 처리하기보다는 get을 사용하라
딕셔너리의 value가 간단한 경우
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
if key not in counters: counters[key] = 0 counters[key] += 1 if key in counters: counters[key] += 1 else: counters[key] = 1 try: counters[key] += 1 except KeyError: counters[key] = 1 #get을 사용할 경우 count = counters.get(key, 0) counters[key] = count + 1
딕셔너리의 값이 복잡한 경우
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
votes = { '바게트': ['철수', '순이'], '치아바타': ['하니', '유리'], } key = '브리오슈' who = '단이' if key in votes: names = votes[key] else: votes[key] = names = [] names.append(who) try: names = votes[key] except KeyError: votes[key] = names = [] names.append(who) #get을 사용할 경우 if (names := votes.get(key)) is None: votes[key] = names = [] names.append(who)
한편, setdefault() 함수를 쓰면 더 간단해진다.
1
names = votes.setdefault(key, []).append(who)
그러나 setdefault라는 이름 때문에 가독성이 떨어지고, 2번째 인자로 전달되는 기본값을 매번 새로 만들어야하기에 성능이 저하될 수 있다.
17. 내부 상태에서 원소가 없는 경우를 처리할 때는 setdefault보다 defaultdict를 사용하라
1
2
3
4
5
6
7
from collections import defaultdict
class Visits:
def __init__(self):
self.data = defaultdict(set)
def add(self, country, city):
self.data[country].add(city)