파이썬 특강 2부

사전(dict) 자료형

사전(dict, dictionary) 자료형은 키(key)와 키에 할당된 값(value)으로 이루어진 쌍들의 집합으로 생각할 수 있다.

영어 사전을 '영어 단어'와 '단어의 뜻'으로 이루어진 쌍들의 집합으로 볼 수 있다는 것과 유사하다는 의미에서 사전 자료형이라 불린다. 실제로 '영어 단어'를 키(key)로, '단어의 뜻'을 해당 단어의 값(value)으로 이해할 수 있다.

사전 자료형을 나타내는 기호는 집합기호인 중괄호({})이며, 빈 사전은 아래와 같이 생성한다.

빈 사전을 아래와 같이 공집합 기호를 사용할 수도 있지만, 혼란 방지를 위해 위 방식을 추천한다.

dict 자료형은 보통 아래 형태이다.

특정 키에 해당하는 값을 확인하려면 리스트의 인덱싱처럼 대괄호를 사용한다. 다만 인덱스 숫자 대신에 키 이름을 사용한다.

예를 들어, "Joel"의 점수(grade)를 확인하려면 다음과 같이 실행한다.

없는 키를 사용하면 오류가 발생한다.

키의 존재여부는 in 연산자를 이용해서 확인한다.

dict 자료형의 get 메소드를 사용하면 키가 존재하지 않아도 오류가 발생하지 않는다.

키가 존재하면 해당 값을 리턴한다.

키가 존재하지 않으면 논(None)을 리턴한다.

주의:

키(key)로 사용될 수 있는 자료형

수정할 수 없는 자료형만 사용할 수 있다.

반면에, 리스트, 사전 자료형은 키로 사용될 수 없다.

사전 자료형 수정

대괄호([])를 사용하여 기존 키 값을 수정하거나 새로운 항목을 추가할 수 있다.

주의: 사전 자료형은 순서는 아무런 의미가 없다.

활용 예제

사전 자료형은 체계적으로 정리된 자료들을 효율적으로 다룬다.

주요 메서드: keys, values, items

키만 또는 값만 따로따로 모아서 확인 및 활용할 수 있다.

사전 자료형에 포함된 키와 값으로 이루어진 쌍들을 일종의 리스트로 확인할 수도 있다.

메서드 활용법

dict_keys, dict_values, dict_items는 사전 자료형과 관련된 새로운 자료형들이지만, 여기서는 자세히 알 필요가 없다. 다만, 아래와 같이 항목들을 for 반복문을 이용하여 접근할 수 있다는 점은 기억해야 한다.

또는 아래와 같이 리스트로 형변환해서 사용할 수도 있다.

in 연산자 처리속도

리스트에서 사용되는 in 연산자와 사전에서 사용되는 in 연산자는 내부적으로 서로 다르게 작동한다. 여기서는 처리속도 관련해서만 설명한다.

자세한 내용은 시간 복잡도를 참조할 수 있다.

defaultdict 클래스 활용

문서에서 단어 빈도수를 확인하고자 할 때 보통 사전 자료형을 이용하며, 빈 사전을 만든 다음에 단어를 키로, 빈도수를 값으로 항목을 추가한다.

방법 1: if ... else... 조건문 활용

단어가 기존에 없으면 새로운 키-값 쌍을 생성하여 추가하고, 기존에 있으면 해당 키값에 1을 더한다.

방법 2: try ... except 예외 처리 활용

사전에 새로운 키-값 항목을 추가할 때 발생할 수 있는 오류에 대비하여 처리한다.

방법 3: get 메소드 활용

get 메소드의 둘째 인자를 활용할 수 있다.

추천 방법: defaultdict 클래스 활용

앞서 설명한 세 가지 방식 모두 약간 복잡하다. 하지만 collections 모듈에서 정의된 defaultdict 클래스를 활용하면 단어가 이미 나왔었는지 여부를 구분하지 않으면서 일을 진행할 수 있다.

defaultdict(int) 의 의미는 다음과 같다.

defaultdict(list) 활용

defaultdict(dict) 활용

아래와 같이 사전 자료형을 값으로 갖는 사전을 생성할 수 있다.

defaultdict(lambda: value) 활용

주의:

Counter 클래스 활용

문자열, 리스트, 튜플, 사전 자료형 등 여러 개의 값을 모둠으로 갖는 값으로부터 항목들의 빈도수를 측정하여 담은 defaultdict 자료형과 유사하지만 보다 강력한 기능을 가진 Counter 자료형을 반환한다.

앞서 여러 방식으로 다루었던 document에 사용된 단어들의 빈도수를 아래와 같이 쉽게 구할 수 있다.

most_common 메소드

Counter 자료형의 메소드 중에 most_common 메소드가 유용하게 사용되며, 빈도수를 기준으로 내림차순으로 정렬해준다.

예를 들어, 빈도수가 가장 높은 항목 세 개를 내림차순으로 보려주려면 다음과 같이 실행한다.

집합(set) 자료형

set 자료형은 집합에 해당하는 자료형이며, 수학에서 배운 집합 개념과 동일하다.

원소의 개수는 len 함수를 이용하여 확인한다.

공집합은 set()으로 생성하며, 원소 추가는 add 메소드를 활용한다.

원소의 포함여부는 in 연산자를 활용하여 확인한다.

집합 자료형 사용 이유

예제

리스트에 중복으로 포함된 항목을 쉽게 제거할 수 있다.

예제

리스트에 중복으로 포함된 항목이 존재하는가를 쉽게 판단할 수 있다. 예를 들어, 아래 함수는 중복 함수의 포함여부를 판단해준다.

예제

길이가 매우 긴 리스트를 대상으로 항목의 존재여부를 판단할 때 집합 자료형으로 형변환을 하면 매우 빠르게 해결할 수 있다.

예제

부분집합 관계를 이용할 수 있다. 예를 들어, 아래 함수는 첫째 인자의 리스트에 포함된 모든 원소가, 둘째 인자의 리스트에 항목으로 포하되는지 여부를 판단한다.

주의: <= 연산자는 집합을 대상으로 할 경우 부분집합 관계를 결정한다.

흐름 제어: if 조건문 활용

이프(if) 조건문을 이용하여 상황에 따른 프로그램을 수행하도록 하는 것은 여느 프로그래밍 언어와 유사하다.

주의:

한 줄 if 조건문

간단한 한 줄 조건문을 종종 사용할 것이다.

흐름 제어: while 반복문 활용

여느 프로그래밍 언어에서처럼 while 반복문도 제공된다. 역시 콜론과 들여쓰기에 주의한다.

흐름 제어: for ... in ... 반복문 활용

while 반복문 보다 for ... in ... 반복문을 보다 많이 사용할 것이다. 특히, range 함수와 찰떡궁합이라서 활용도가 매우 높다.

range 함수

지정된 범위의 정수 수열을 생성하는 함수이다. 자료형은 리스트와 비슷하다.

0부터 9까지의 정수로 구성된 수열을 생성하기:

리스트의 슬라이싱에서 사용하는 구간의 처음과 끝, 스텝(step)을 이용할 수도 있다.

continuebreak

for ... in ... 반복문을 이용하여 좀 더 복잡한 알고리즘을 구성하려면 continuebreak를 잘 활용하면 된다.

부울(bool) 자료형: 진리값

파이썬에서 사용되는 진리값은 모두 대문자로 시작한다: True(참), False(거짓)

진리값 연산자: and, or, not

논리합(and), 논리곱(or), 부정(not) 연산자는 진리값을 대상으로 하며 여느 프로그래밍 언어에서 배운 내용과 동일하게 작동한다.

None

C, Java 언어에서 사용되는 널(null) 값에 해당하는 것이 파이썬에서는 None 이며, 다른 언어에서와의 차이점을 None 도 하나의 값이라는 점이다. 즉, 변수에 저장하고 다른 값과 비교할 수 있다.

아래와 같이 assert 키워드를 이용하여 원하는 결과가 나오는지를 테스팅할 수 있다.

주장이 참이면 아무 것도 보여주지 않는다. 하지만 주장이 틀리면 오류를 발생시킨다.

예외 처리를 이용하여 주장이 왜 틀렸는지 등을 보여줄 수 있다.

주의: assert에 대해서는 파이썬 속성 강좌 2부에서 좀 더 다룬다.

거짓(False)으로 간주되는 값

아래 값들은 상황에 따라 부울 자료형의 거짓(False)으로 간주된다.

나머지 값들의 대부분은 상황에 따라 부울 자료형의 참(True)으로 간주된다.

예제 1: 빈 문자열을 반환하는 함수의 반환값은 거짓으로 취급됨.

주의: == 는 양측의 값의 동일성을 결정한다.

and 연산자 작동방식

위 코드는 아래와 같이 한 줄로 작성할 수 있다.

이유는 and 연산자의 작동방식에 찾을 수 있다.

or 연산자 작동방식

A or B는 다음처럼 작동한다.

예제 2: 아래 두 명령문은 동일한 일을 수행한다.

allany 함수

리스트에 대해