Home 파이썬 코딩의 기술(2) 리스트와 딕셔너리
Post
Cancel

파이썬 코딩의 기술(2) 리스트와 딕셔너리

  • 책 파이선 코딩의 기술을 읽고 정리한 내용입니다. Book_Logo

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을 사용하라

  1. 딕셔너리의 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
    
  2. 딕셔너리의 값이 복잡한 경우

    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)

18. __missing__을 사용해 키에 따라 다른 디폴트 값을 생성하는 방법을 알아두라


This post is licensed under CC BY 4.0 by the author.

파이썬 코딩의 기술(3) 함수

도덕의 계보 요약과 해석