관리 메뉴

클라이언트/ 서버/ 엔지니어 " 게임 개발자"를 향한 매일의 공부일지

다양한 데이터 다루기 3 - 딕셔너리 초기화 및 데이터 출력에 대하여 본문

프로그래밍 언어/파이썬

다양한 데이터 다루기 3 - 딕셔너리 초기화 및 데이터 출력에 대하여

huenuri 2024. 10. 5. 23:07

자료형을 다루는 라이브러리를 이어서 학습해보려고 한다.


 

 

 

 

딕셔너리를 한 번에 초기화하려면? - collections.defaultdict

collections.defaultdict는 값에 초기값을 지정하여 딕셔너리를 생성하는 모듈이다.

 

문자열을 이용하여 사용한 문자(Key)와 해당 문자의 사용 횟수(value)를 딕셔너리로 만들려면 어떻게 해야 할까? 단, 공백 등 특수 문자도 포함하며 대소문자는 구분하기로 한다.

다음 이 문제의 일반적인 풀이이다.

 

방어적인 코드 없이 다음처럼 작성해본다.

 

 

하지만 키에러가 발생하고 있다. 딕셔너리를 사용할 때는 초기값에 신경을 써야 한다. 다음은 collections의 deaultdict를 이용한 방법이다.

 

 

defaultdict()의 인수로 int를 전달하여 딕셔너리 d를 생성했다. int를 기준으로 생성한 딕셔너리 d의 값은 항상 0으로 자동 초기화되므로 초기화를 위한 별도의 코드가 필요 없다.

 

collections - 컨테이너 데이터형

 

collections — Container datatypes

Source code: Lib/collections/__init__.py This module implements specialized container datatypes providing alternatives to Python’s general purpose built-in containers, dict, list, set, and tuple.,,...

docs.python.org


 

 

 

 

수상자 3명을 선정하려면? - heapq

heapq는 순위가 가장 높은 자료를 가장 먼저 꺼내는 오선순위 큐를 구현한 모듈이다. 리스트 등을 사용하여 우선순위 큐를 직접 구현하기가 어렵진 않지만, 이보다는 이런 작업에 최적화된 모듈인 heapq를 사용한다.

 

교내 육상대회의 100m 달리기 경기 결과 다음과 같은 기록을 얻었다.

 

이 결과를 바탕으로 3명에게 기록 순으로 금, 은, 동메달을 수여하고자 한다. 기록이 좋은 순서대로 3명을 자동으로 뽑는 프로그램은 어떻게 만들면 될까?


 

 

 

먼저 heapq를 사용한 코드를 살펴본다.

 

힙으로 사용할 h 변수를 빈 리스트로 생성하고 heappush()로 힙에 데이터를 추가한다. 힙에 추가한 데이터는 기록과 선수 이름을 쌍으로 하는 튜플 score이다. 이때 heappush()로 튜플을 추가할 때는 데이터의 우선순위를 나타내는 항목이 첫 번째여야 한다. 따라서 기록과 선수 이름을 쌍으로 하는 튜블은 (이름, 기록)이 아닌 (기록, 이름)으로 해야 한다.

이렇게 힙을 구성하면 heapq.heappop()을 이용하여 우선순위 대로 값을 꺼낼 수 있다.

 

힙 데이터를 생성하는 부분은 heapify() 함수를 사용하여 구현해 본다.

 

 

 

이때 nsmallest() 함수를 사용하면 간단하게 할 수 있다.

 

 

heapq.nsmallest(n, iterable)는 반복 가능한 객체 데이터 집합에서 n개의 가장 작은 요소로 구성된 리스트를 반환한다.

 

heapq - 힙 큐 알고리즘

 

heapq — Heap queue algorithm

Source code: Lib/heapq.py This module provides an implementation of the heap queue algorithm, also known as the priority queue algorithm. Heaps are binary trees for which every parent node has a va...

docs.python.org


 

 

 

 

데이터를 보기 좋게 출력하려면? - pprint

pprint는 데이터를 보기 좋게 출력할 때 사용하는 모듈이다. 다양한 내용으로 이루어진 result 딕셔너리를 보기 좋게 출력할 수 있다.

하지만 이 내용은 실습을 할 수 없어서 관련 자료만 첨부해 본다.

 

pprint - 예쁜 데이터 인쇄기

 

pprint — Data pretty printer

Source code: Lib/pprint.py The pprint module provides a capability to “pretty-print” arbitrary Python data structures in a form which can be used as input to the interpreter. If the formatted struc...

docs.python.org


 

 

 

 

점수에 따른 학점을 구하려면? - 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() 함수를 사용하면 학점을 구분하는 점수가 리스트의 요소와 같을 때 삽입의 위치가 오른쪽이 아닌 왼쪽이 된다.

 

 

 

bisect - 배열 이진 분할 알고리즘

 

bisect — Array bisection algorithm

Source code: Lib/bisect.py This module provides support for maintaining a list in sorted order without having to sort the list after each insertion. For long lists of items with expensive compariso...

docs.python.org

 

 

if 문 더 알아보기

 

03-1 if문

먼저 대표적인 조건문인 if 문부터 알아보자. [TOC] ## if 문은 왜 필요할까? 다음과 같은 상상을 해 보자. ```no-highlight ‘돈이 있으면 택시를 …

wikidocs.net

 


 

 

 

 

학습을 마치고

어제 이 내용까지는 공부했어야 했는데 다 하지 못한 걸 아침에 하는 중이다. 라이브러리 내용이 정말 많지만 그래도 한 번씩은 다루고 실습해보려고 한다.

정렬 라이브러리에서 insert인 줄 알았는데 이름이 insort였다.