자료형을 다루는 라이브러리를 이어서 학습해보려고 한다.
딕셔너리를 한 번에 초기화하려면? - collections.defaultdict
collections.defaultdict는 값에 초기값을 지정하여 딕셔너리를 생성하는 모듈이다.
문자열을 이용하여 사용한 문자(Key)와 해당 문자의 사용 횟수(value)를 딕셔너리로 만들려면 어떻게 해야 할까? 단, 공백 등 특수 문자도 포함하며 대소문자는 구분하기로 한다.
다음 이 문제의 일반적인 풀이이다.
방어적인 코드 없이 다음처럼 작성해본다.
하지만 키에러가 발생하고 있다. 딕셔너리를 사용할 때는 초기값에 신경을 써야 한다. 다음은 collections의 deaultdict를 이용한 방법이다.
defaultdict()의 인수로 int를 전달하여 딕셔너리 d를 생성했다. int를 기준으로 생성한 딕셔너리 d의 값은 항상 0으로 자동 초기화되므로 초기화를 위한 별도의 코드가 필요 없다.
수상자 3명을 선정하려면? - heapq
heapq는 순위가 가장 높은 자료를 가장 먼저 꺼내는 오선순위 큐를 구현한 모듈이다. 리스트 등을 사용하여 우선순위 큐를 직접 구현하기가 어렵진 않지만, 이보다는 이런 작업에 최적화된 모듈인 heapq를 사용한다.
교내 육상대회의 100m 달리기 경기 결과 다음과 같은 기록을 얻었다.
이 결과를 바탕으로 3명에게 기록 순으로 금, 은, 동메달을 수여하고자 한다. 기록이 좋은 순서대로 3명을 자동으로 뽑는 프로그램은 어떻게 만들면 될까?
먼저 heapq를 사용한 코드를 살펴본다.
힙으로 사용할 h 변수를 빈 리스트로 생성하고 heappush()로 힙에 데이터를 추가한다. 힙에 추가한 데이터는 기록과 선수 이름을 쌍으로 하는 튜플 score이다. 이때 heappush()로 튜플을 추가할 때는 데이터의 우선순위를 나타내는 항목이 첫 번째여야 한다. 따라서 기록과 선수 이름을 쌍으로 하는 튜블은 (이름, 기록)이 아닌 (기록, 이름)으로 해야 한다.
이렇게 힙을 구성하면 heapq.heappop()을 이용하여 우선순위 대로 값을 꺼낼 수 있다.
힙 데이터를 생성하는 부분은 heapify() 함수를 사용하여 구현해 본다.
이때 nsmallest() 함수를 사용하면 간단하게 할 수 있다.
heapq.nsmallest(n, iterable)는 반복 가능한 객체 데이터 집합에서 n개의 가장 작은 요소로 구성된 리스트를 반환한다.
데이터를 보기 좋게 출력하려면? - pprint
pprint는 데이터를 보기 좋게 출력할 때 사용하는 모듈이다. 다양한 내용으로 이루어진 result 딕셔너리를 보기 좋게 출력할 수 있다.
하지만 이 내용은 실습을 할 수 없어서 관련 자료만 첨부해 본다.
점수에 따른 학점을 구하려면? - bisect
bisect는 이진 탐색 알고리즘을 구현한 모듈로, bisect.bisect() 함수는 정렬된 리스트에 값을 삽입할 때 정렬을 유지할 수 있는 정렬을 유지할 수 있는 인덱스를 반환한다.
A반의 학생 수는 모두 7명으로, 성적에 대한 학점을 정한다고 할 때 A반 학생의 학점을 순서대로 구하려면 어떻게 해야 할까?
보통 이런 문제는 bisect.bisect() 함수를 사용하면 더 우아하고 간결하게 풀 수 있다.
bisect() 함수는 [60, 70, 80, 90]을 기준으로 score를 정렬하여 삽입할 수 있는 인덱스를 반환한다. 예를 들어 85점이라면 80과 90점 사이인 3을 반환한다.
학점 기준이 이상에서 초과로 변경된다면 80점은 B가 아닌 C가 되어야 한다. 이럴 때는 다음처럼 bisect() 함수 대신 bisect_left() 함수를 사용한다.
bisect_left() 함수를 사용하면 학점을 구분하는 점수가 리스트의 요소와 같을 때 삽입의 위치가 오른쪽이 아닌 왼쪽이 된다.
학습을 마치고
어제 이 내용까지는 공부했어야 했는데 다 하지 못한 걸 아침에 하는 중이다. 라이브러리 내용이 정말 많지만 그래도 한 번씩은 다루고 실습해보려고 한다.
정렬 라이브러리에서 insert인 줄 알았는데 이름이 insort였다.
'프로그래밍 언어 > 파이썬' 카테고리의 다른 글
숫자와 숫자 다루기 1 - 최대공배수와 최소공배수 모듈 및 소수점 자릿수 표현하기 (0) | 2024.10.06 |
---|---|
다양한 데이터 다루기 4 - 숫자에 이름 붙여서 사용하기 및 위상정렬로 과목의 순서 정하기 (0) | 2024.10.06 |
다양한 데이터 다루기 2 - 자료형 넣고 빼기 및 이름 붙이기, 사용한 단어의 개수 구하기 (0) | 2024.10.05 |
다양한 데이터 다루기 1 - 날짜 계산하고 요일 알아내기 및 두 날짜의 차이, 윤년 판별하기 (0) | 2024.10.05 |
바이너리 데이터 다루기 - C로 만든 데이터 출력하기 (0) | 2024.10.05 |