5.5 파이썬 표준 라이브러리

5.5.1 누락된 키 처리하기 : setdefault(), defaultdict()

  • setdefault()get() 함수와 같지만 키가 누락된 경우 딕셔너리에 항목을 할당 할 수 있다
    periodic_table = {'Hydrogen': 1, 'Helium': 2}
    print(periodic_table)
    

    {‘Hydrogen’: 1, ‘Helium’: 2}

    carbon = periodic_table.setdefault('Carbon', 12)
    carbon
    

    12

    periodic_table
    

    {‘Carbon’: 12, ‘Helium’: 2, ‘Hydrogen’: 1}

  • 존재하는 키에 다른 기본값을 할당하려 하면 키에 대한 원래 값이 반환되고 아무것도 바뀌지 않는다.
    helium = periodic_table.setdefault('Helium', 947)
    helium
    

    2

    periodic_table
    

    {‘Carbon’: 12, ‘Helium’: 2, ‘Hydrogen’: 1}

  • defaultdict() 함수도 비슷하다. 다른 점은 딕셔너리를 생성할 때 모든 새키 에 대한 기본값을 먼저 지정하는 것.
    이 함수의 인자는 함수다.
    from collections import defaultdict
    periodic_table = defaultdict(int)
    
    periodic_table['Hydrogen'] = 1
    periodic_table['Lead']
    

    0

    periodic_table
    

    defaultdict(int, {‘Hydrogen’: 1, ‘Lead’: 0})

  • defaultdict()의 인자는 값을 누락된 키에 할당하여 반환하는 함수.
    from collections import defaultdict
    def no_idead():
    return 'Huh?'
    bestiary = defaultdict(no_idead)
    bestiary['A'] = 'Abominable Sonwman'
    bestiary['B'] = 'Basilisk'
    bestiary['A']
    

    ‘Abominable Sonwman’

    bestiary['B']
    

    ‘Basilisk’

    bestiary['C']
    

    ‘Huh?’

    빈 기본값을 반환하기 위해 int()는 0, list() 는 [], dict()는 {}를 반환한다. 인자가 없으면 None

    bestiary = defaultdict(lambda: 'Huh?')
    bestiary['e']
    

    ‘Huh?’

    from collections import defaultdict
    food_counter = defaultdict(int)
    for food in ['spam', 'spam', 'eggs', 'spam']:
    food_counter[food] += 1
    
    for food, count in food_counter.items():
    print(food, count)
    

    spam 3 eggs 1

    dict_counter = {}
    for food in ['spam', 'spam', 'eggs', 'spam']:
    if not food in dict_counter:
    dict_counter[food] = 0
    dict_counter[food] += 1
    
    for food, count, in food_counter.items():
    print(food, count)
    

    spam 3 eggs 1

    5.5.2 항목 세기: Counter()

  • 표준 라이브러리에는 항목을 셀 수 있는 함수가 여러 개 있다.
    from collections import Counter
    breakfast = ['spam', 'spam', 'eggs', 'spam']
    breakfast_counter = Counter(breakfast)
    breakfast_counter
    

    Counter({‘eggs’: 1, ‘spam’: 3})

  • most_common() 함수는 모든 요소를 내림차수느로 반환한다. 인자를 숫자로 입력하는 경우, 그 숫자만큼 상위 요소를 반환한다.
    breakfast_counter.most_common()
    

    [(‘spam’, 3), (‘eggs’, 1)]

    breakfast_counter.most_common(1)
    

    [(‘spam’, 3)]

  • 카운터를 결합 할 수 있다.
    breakfast_counter
    

    Counter({‘eggs’: 1, ‘spam’: 3})

    lunch = ['eggs', 'eggs', 'bacon']
    lunch_counter = Counter(lunch)
    lunch_counter
    

    Counter({‘bacon’: 1, ‘eggs’: 2})

    breakfast_counter + lunch_counter
    

    Counter({‘bacon’: 1, ‘eggs’: 3, ‘spam’: 3})

    + 연산자를 사용하여 결합 가능.

    breakfast_counter - lunch_counter
    

    Counter({‘spam’: 3}) -연산자를 사용하여 빼기 가능

    lunch_counter - breakfast_counter
    

    Counter({‘bacon’: 1, ‘eggs’: 1})

  • &연산자를 이용해 공통된 항목을 얻을 수 있다.
    breakfast_counter & lunch_counter
    

    Counter({‘eggs’: 1})

    인터섹션 연산으로 낮은 숫자의 공통 항목인 ‘eggs’를 선택했다. breakfast_counter에서 ‘eggs’가 1개 이기 떄문에 공통항목으로 1이 나오는것 이다.

    breakfast_counter | lunch_counter
    

    Counter({‘bacon’: 1, ‘eggs’: 2, ‘spam’: 3}) 공통 항목으로 유니온 연산을하면 높은 숫자의 공통 항목을 선택 한다.

    5.5.3 키 정렬하기: OrderedDict()

    quotes = {
    'Moe': 'A wise guy, huh?',
    'Larry': 'Ow!',
    'Curly': 'Nyik nyuk',
    }
    for stooge in quotes:
    print(stooge)
    

    Moe Larry Curly

  • OrderedDict() 함수는 키의 추가 순서를 기억하고, 이터레이터로 부터 순서대로 키 값을 반환한다.
    from collections import OrderedDict
    quotes = OrderedDict([
    ('Moe', 'A wise guy, huh?'),
    ('Larry', 'Ow!'),
    ('Curly', 'Nyuk nyuk!')
    ])
    for stooge in quotes:
    print(stooge)
    

    Moe Larry Curly

    5.5.3 스택 + 큐 == 데크

    ** 데크는 스택과 큐의 기능을 모두 가진 출입구가 양 끝에 있는 큐다. **

    def palindrome(word):
    from collections import deque
    dq = deque(word)
    while len(dq) > 1:
    if dq.popleft() != dq.pop():
    return False
    return True
    
    palindrome('a')
    

    True

    palindrome('racecar')
    

    True

    palindrome('')
    

    True

    palindrome('radar')
    

    True

    palindrome('halibut')
    

    False

    palindrome('기러기')
    

    True

    palindrome('고양이')
    

    False

    def another_palindrome(word):
    return word == word[::-1]
    
    another_palindrome('기러기')
    

    True

    5.5.5 코드 구조 순회하기: itertools

    import itertools
    for item in itertools.chain([1,2], ['a', 'b']):
    print(item)
    

    1 2 a b

    chain()함수는 순회가능한 인자들을 하나씩 반환한다.

    for item in itertools.cycle([1,2]):
    print(item)
    

    1,
    2,
    1,
    2,

KeyboardInterrupt Traceback (most recent call last)
<ipython-input-69-c74ac3256fcc> in <module>()
1 for item in itertools.cycle([1,2]):
----> 2     print(item)


~/.pyenv/versions/3.6.4/envs/fc-python/lib/python3.6/site-packages/ipykernel/iostream.py in write(self, string)
374             is_child = (not self._is_master_process())
375             # only touch the buffer in the IO thread to avoid races
--> 376             self.pub_thread.schedule(lambda : self._buffer.write(string))
377             if is_child:
378                 # newlines imply flush in subprocesses
~/.pyenv/versions/3.6.4/envs/fc-python/lib/python3.6/site-packages/ipykernel/iostream.py in schedule(self, f)
201             self._events.append(f)
202             # wake event thread (message content is ignored)
--> 203             self._event_pipe.send(b'')
204         else:
205             f()
zmq/backend/cython/socket.pyx in zmq.backend.cython.socket.Socket.send()
zmq/backend/cython/socket.pyx in zmq.backend.cython.socket.Socket.send()
zmq/backend/cython/socket.pyx in zmq.backend.cython.socket._send_copy()
~/.pyenv/versions/3.6.4/envs/fc-python/lib/python3.6/site-packages/zmq/backend/cython/checkrc.pxd in zmq.backend.cython.checkrc._check_rc()
KeyboardInterrupt:

cycle()은 인자를 순환하는 무한 이터레이터 이다.

for item in itertools.accumulate([1,2,3,4]):
print(item)

1 3 6 10 accumulate() 함수는 축적된 값을 계산한다. 기본적으로 합계를 계산 함.

def multiply(a,b):
return a * b
for item in itertools.accumulate([1,2,3,4], multiply):
print(item)

1 2 6 24 accumulate() 함수의 두번째 인자로 함수를 전달하여 전달된 함수를 사용 할 수 있다.

5.5.6 깔끔하게 출력하기 : pprint()

from pprint import pprint
from collections import OrderedDict
quotes = OrderedDict([
('Moe', 'A wise guy, huh?'),
('Larry', 'Ow!'),
('Curly', 'Nyuk nyuk!'),
])
print(quotes)

OrderedDict([(‘Moe’, ‘A wise guy, huh?’), (‘Larry’, ‘Ow!’), (‘Curly’, ‘Nyuk nyuk!’)])

pprint(quotes)

OrderedDict([(‘Moe’, ‘A wise guy, huh?’), (‘Larry’, ‘Ow!’), (‘Curly’, ‘Nyuk nyuk!’)])

5.6 배터리장착: 다른 파이썬 코드 가져오기

Comments