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