파이상자 Handle Missing Keys with setdefault() and defaultdict()
Handle Missing Keys with setdefault() and defaultdict()
존재하지 않는 키로 사전에 액세스하려고 하면 탁월한 효과를 얻을 수 있습니다. 사전 get() 함수를 사용하여 기본값을 반환하면 예외가 발생하지 않습니다.
setdefault() 함수는 get()와 같지만 키가 없는 경우 사전에 항목을 할당합니다.
>>> periodic_table = {'Hydrogen': 1, 'Helium': 2} >>> print(periodic_table)
{'Helium': 2, 'Hydrogen': 1}
키가 사전에 없는 경우 새 값이 사용됩니다.
>>> carbon = periodic_table.setdefault('Carbon', 12)
>>> carbon
12
>>> periodic_table
{'Helium': 2, 'Carbon': 12, 'Hydrogen': 1}
기존 키에 다른 기본값을 할당하려고 하면 원래 값이 반환됩니다.
아무것도 변경되지 않습니다.
>>> helium = periodic_table.setdefault('Helium', 947)
>>> helium
2
>>> periodic_table
{'Helium': 2, 'Carbon': 12, 'Hydrogen': 1}
defaultdict()도 비슷하지만 사전을 만들 때 앞에 있는 모든 새 키의 기본값을 지정합니다. 인수는 함수입니다. 이 예에서는 int()라고 하는 함수 int를 전달하고 정수 0을 반환합니다.
>>> from collections import defaultdict >>> periodic_table = defaultdict(int)
이제 결측값은 정수(int)이며 값은 0입니다.
>>> periodic_table['Hydrogen'] = 1
>>> periodic_table['Lead']
0
>>> periodic_table
defaultdict(<class 'int'>, {'Lead': 0, 'Hydrogen': 1})
defaultdict() 인수는 누락된 키에 할당할 값을 반환하는 함수입니다. 다음 예에서 no_idea()는 필요할 때 값을 반환하기 위해 실행됩니다.
>>> from collections import defaultdict >>>
>>> def no_idea():
... return 'Huh?'
...
>>> bestiary = defaultdict(no_idea)
>>> bestiary['A'] = 'Abominable Snowman'
>>> bestiary['B'] = 'Basilisk'
>>> bestiary['A']
'Abominable Snowman'
>>> bestiary['B']
'Basilisk'
>>> bestiary['C']
'Huh?'
int() 함수, list() 함수 또는 dict() 함수를 사용하여 해당 유형의 기본 빈 값을 반환할 수 있습니다. int()는 0을 반환하고 list()는 빈 목록([])을 반환하며 dict()는 빈 사전({})을 반환합니다. 인수를 생략하면 새 키의 초기 값이 없음으로 설정됩니다.
그런데 통화 내에서 람다를 사용하여 기본 설정 함수를 정의할 수 있습니다.
>>> bestiary = defaultdict(lambda: 'Huh?') >>> bestiary['E']
'Huh?'
int를 사용하는 것도 자신만의 카운터를 만드는 한 가지 방법입니다.
>>> 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)
...
eggs 1
spam 3
앞의 예에서, food_counter가 디폴트딕트 대신 일반 사전이었다면, 파이썬은 초기화되지 않았기 때문에 food_counter[food] 사전 요소를 증가시키려고 할 때마다 예외를 제기했을 것이다. 여기에 표시된 것처럼 추가 작업이 필요했을 것입니다.
>>> dict_counter = {}
>>> for food in ['spam', 'spam', 'eggs', 'spam']:
...
>>> for food, count in dict_counter.items(): ... print(food, count)
...
spam 3 eggs 1
Count Items with Counter()
카운터 얘기가 나와서 말인데, 표준 라이브러리에는 이전 예제와 같은 작업을 수행하는 라이브러리가 있습니다.
>>> from collections import Counter
>>> breakfast = ['spam', 'spam', 'eggs', 'spam'] >>> breakfast_counter = Counter(breakfast)
>>> breakfast_counter
Counter({'spam': 3, 'eggs': 1})
most_common() 함수는 모든 요소를 내림차순으로 반환하거나 카운트가 주어진 경우 최상위 카운트 요소만 반환합니다.
>>> breakfast_counter.most_common()
[('spam', 3), ('eggs', 1)]
>>> breakfast_counter.most_common(1)
[('spam', 3)]
카운터를 결합할 수 있습니다. 먼저, breakfast_counter에 무엇이 있는지 다시 한 번 살펴보겠습니다.
>>> breakfast_counter
>>> Counter({'spam': 3, 'eggs': 1})
이번에는 점심이라고 불리는 새로운 목록과 점심 카운터라고 불리는 카운터를 만들겠습니다.
>>> lunch = ['eggs', 'eggs', 'bacon']
>>> lunch_counter = Counter(lunch)
>>> lunch_counter
Counter({'eggs': 2, 'bacon': 1})
두 카운터를 결합하는 첫 번째 방법은 +를 사용하는 덧셈입니다.
>>> breakfast_counter + lunch_counter
Counter({'spam': 3, 'eggs': 3, 'bacon': 1})
예상하신 대로 -를 사용하여 카운터 하나를 다른 카운터에서 뺍니다.
아침은 안먹고 점심은 안먹어?
>>> breakfast_counter - lunch_counter
Counter({'spam': 3})
좋아요, 그럼 아침으로 먹을 수 없는 점심으로 뭘 먹을 수 있을까요?
>>> lunch_counter - breakfast_counter
Counter({'bacon': 1, 'eggs': 1})
이전의 세트와 마찬가지로 교차로 op‐ erator &:를 사용하여 공통 항목을 얻을 수 있습니다.
>>> breakfast_counter & lunch_counter
Counter({'eggs': 1})
교차로는 공통 요소(계란)를 더 낮은 수로 선택했습니다. 이것은 말이 된다: 아침식사는 계란 한 개만 제공했기 때문에, 그것이 일반적인 계산이다.
마지막으로, 유니언 연산자를 사용하여 모든 항목을 가져올 수 있습니다. |:
>>> breakfast_counter | lunch_counter
Counter({'spam': 3, 'eggs': 2, 'bacon': 1})
'계란'이라는 항목은 다시 두 가지 모두에 공통적이었다. 조합은 덧셈과 달리 인원수를 늘리지 않고 더 큰 숫자를 골랐다.
Order by Key with OrderedDict()
이 책의 초기 장에 있는 많은 코드 예제는 사전의 키 순서를 예측할 수 없다는 것을 보여준다. 키 a, b 및 c는 해당 순서로 추가할 수 있지만 키()는 c, a, b를 반환할 수 있다. 여기 이전포스팅에서 용도를 변경한 예가 있습니다.
>>> quotes = {
- ... 'Moe': 'A wise guy, huh?',
- ... 'Larry': 'Ow!',
- ... 'Curly': 'Nyuk nyuk!', ... }
>>> for stooge in quotes:
... print(stooge)
...
Larry
Curly
Moe
OrderedDict()는 키 추가 순서를 기억하고 반복자로부터 동일한 순서로 반환합니다. (키, 값) 튜플 순서에서 OrderedDict를 만들어 보십시오.
- >>> from collections import OrderedDict >>> quotes = OrderedDict([
- Stack + Queue == deque
데크(데크 발음)는 스택과 큐의 기능을 모두 갖춘 이중 종단 큐입니다. 시퀀스의 양쪽 끝에서 항목을 추가 및 삭제할 때 유용합니다. 여기, 우리는 단어 양쪽 끝에서 중간까지 페일린 드롬인지 알아봅니다. popleft() 함수는 데크에서 맨 왼쪽 항목을 제거했다가 반환합니다. pop()은 맨 오른쪽 항목을 제거했다가 반환합니다. 함께, 그들은 끝에서 중간까지 일을 합니다. 끝 문자가 일치하는 한 중간에 도달할 때까지 계속 터집니다.
>>> def palindrome(word):
...
>>> palindrome('a')
True
from collections import deque dq = deque(word)
while len(dq) > 1:
if dq.popleft() != dq.pop(): return False
return True
>>> palindrome('racecar')
True
>>> palindrome('')
True
>>> palindrome('radar')
True
>>> palindrome('halibut')
False
저는 이것을 단순한 데크의 삽화로 사용했습니다. 만약 당신이 빠른 회문 체커를 원한다면, 단지 문자열을 그것의 반대와 비교하는 것이 훨씬 더 간단할 것이다. Python에는 문자열에 대한 역함수가 없지만 여기에 표시된 것처럼 슬라이스로 문자열을 역방향으로 사용할 수 있는 방법이 있습니다.
>>> def another_palindrome(word): ... return word == word[::-1] ...
>>> another_palindrome('radar') True
>>> another_palindrome('halibut')
False
Iterate over Code Structures with itertools
이터툴스는 특수 목적 반복기 기능을 포함한다. 각각 ...에 대해 a 내에서 호출하면 한 번에 하나의 항목을 반환합니다. 호출 사이의 상태를 기억합니다.
chain은 마치 하나의 참을 수 있는 것처럼 그 논거를 통과한다.
>>> import itertools
>>> for item in itertools.chain([1, 2], ['a', 'b']): ... print(item)
...
1
2
a
b
cycle()은 무한 반복자로, 그 인수를 순환한다.
>>> import itertools
>>> for item in itertools.cycle([1, 2]): ... print(item)
...
1
2
1
2
.
.
.
기타 등등.
누적은 누적된 값을 계산합니다. 기본적으로 합계가 계산됩니다.
>>> import itertools
>>> for item in itertools.accumulate([1, 2, 3, 4]): ... print(item)
...
1
3
6
10
누적()할 두 번째 인수로 함수를 제공할 수 있으며, 추가 대신 이 인수가 사용됩니다. 함수는 두 개의 인수를 사용하여 단일 결과를 반환해야 합니다. 이 예제에서는 누적 제품을 계산합니다.
>>> import itertools
>>> def multiply(a, b):
... returna*b
...
>>> for item in itertools.accumulate([1, 2, 3, 4], multiply): ... print(item)
...
1
2
6
24
이터툴즈 모듈에는 더 많은 기능이 있으며, 특히 필요에 따라 시간을 절약할 수 있는 조합과 순열에 대한 기능이 있습니다.
Print Nicely with pprint()
모든 예제는 인쇄()(또는 대화형 인터프리터의 변수 이름만)를 사용하여 인쇄했습니다. 때때로, 그 결과는 읽기 어렵다. 우리는 print 와 같은 예쁜 프린터가 필요하다.
>>> from pprint import pprint >>> 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()는 가독성을 높이기 위해 요소를 정렬하려고 합니다.
- >>> pprint(quotes)
- {'Moe': 'A wise guy, huh?',
- 'Larry': 'Ow!',
- 'Curly': 'Nyuk nyuk!'}
More Batteries: Get Other Python Code
때때로, 표준 라이브러리는 여러분이 필요로 하는 것을 가지고 있지 않거나, 아주 올바른 방법으로 그것을 하지 않습니다. 오픈 소스, 타사 파이썬 소프트웨어가 전 세계에 걸쳐 있습니다. 좋은 리소스는 다음과 같습니다.
- • PyPi (also known as the Cheese Shop, after an old Monty Python skit)
- • github
- • readthedocs
activestate에서 더 작은 코드 예제를 많이 볼 수 있습니다.
이 책에 있는 거의 모든 파이썬 코드는 모든 내장 및 표준 라이브러리를 포함하는 컴퓨터에 표준 파이썬 설치를 사용합니다. 외부 패키지는 다음과 같은 위치에 있습니다. 1장에서 요청을 언급했으며, 222페이지의 "표준 라이브러리 너머: 요청"에서 자세한 내용을 설명합니다. 부록 D는 다른 많은 너트 앤 볼트 개발 세부사항과 함께 타사 파이썬 소프트웨어를 설치하는 방법을 보여준다.
해야 할 일
5.1. zoo.py이라는 파일을 만듭니다. 여기에서 '매일 9-5 열기' 문자열을 인쇄하는 hours()라는 함수를 정의합니다. 그런 다음 대화형 통역기를 사용하여 동물원 모듈을 가져오고 시간() 기능을 호출합니다.
5.2. 대화형 통역기에서 동물원 모듈을 menagerie로 가져오고 시간() 기능을 호출한다.
5.3. 통역실에 머무르면서 동물원으로부터 직접 시간() 기능을 가져와 전화한다.
5.4. 시간() 기능을 정보로 가져와 호출합니다.
5.5. 키-값 쌍 'a'가 1, 'b': 2, 'c'인 일반 사전을 만듭니다.
3번, 그리고 인쇄하세요.
5.6. 5.5에 나열된 동일한 쌍으로 팬시라고 불리는 OrderedDict를 만들어 인쇄합니다.
일반과 같은 순서로 인쇄되었습니까?
5.7. dict_of_lists라는 디폴트딕트를 만들어 인수 목록을 전달합니다. 목록을 dict_of_lists['a']로 만들고 한 번의 할당으로 'something for a' 값을 추가합니다. dict_of_lists['a']를 인쇄합니다.