우아한 개발계발 블로그

따라하며 배우는 파이썬과 데이터 과학 (8) - 연관된 데이터를 딕셔너리로 짝을 짓자 본문

Study/따라하며 배우는 파이썬과 데이터 과학

따라하며 배우는 파이썬과 데이터 과학 (8) - 연관된 데이터를 딕셔너리로 짝을 짓자

W00_Ah 2021. 6. 20. 15:01

2021.06.20 - [Study/따라하며 배우는 파이썬과 데이터 과학] - 따라하며 배우는 파이썬과 데이터 과학 (7) - 데이터를 리스트와 튜플로 묶어보자

 

 

따라하며 배우는 파이썬과 데이터 과학 (7) - 데이터를 리스트와 튜플로 묶어보자

2021.06.20 - [Study/따라하며 배우는 파이썬과 데이터 과학] - 따라하며 배우는 파이썬과 데이터 과학 (6) - 함수로 일처리를 짜임새있게 하자 따라하며 배우는 파이썬과 데이터 과학 (6) - 함수로 일처

w00-ah.tistory.com


8.1. 딕셔너리(Dictionary) 

리스트와 같이 값을 저장하지만, 리스트와는 다르게 값(Value)에 관련된 키(key)가 있다. 이를 키-값 쌍(key-value pair)라고 한다.

딕셔너리 사용 예시

>>> name = {} # 공백의 딕셔너리를 생성
>>> name['first'] = 'Woo'
>>> name['last'] = 'Ah'
>>> name 
{'first': 'Woo', 'last': 'Ah'}

(키:값) 한 쌍이 하나의 항목(item)으로 이루어 진다. 딕셔너리를 출력하면 항목이 쉼표로 구분되어 출력된다.

 

딕셔너리에서 가장 중요한 연산은 키를 연관된 값을 찾는 것이다.  그래서 정의된 딕셔너리 자료형의 key 들을 알려면 

keys()라는 메소드를 사용하면 알 수 있다.

>>> name.keys()
dict_keys(['first', 'last'])

반대로 딕셔너리에서 사용되느 value 값들을 알려면 values() 메소드를 사용하면 되고, 그냥 모든 아이템들을 확인하고 싶다면, items() 메소드를 이용하면 된다. 

>>> name.values()
dict_values(['Woo', 'Ah'])

>>> name.items()
dict_items([('first', 'Woo'), ('last', 'Ah')])

 

딕셔너리의 모든 항목을 하나씩 출력하는데에는 다양한 방법이 있겠지만 for 반복문을 이용하면 아래처럼 할 수 있고,

>>> for i in name:
...     print(i,name[i])
    
first Woo
last Ah

혹은 items() 메소드의 반환 구조를 생각하여 다음과 같이도 가능하다.

>>> for i,j in name.items():
...     print(i,j)
    
first Woo
last Ah

8.2. Dictionary Sort

데이터를 다루면서 정렬은 불가피한 작업이다. 그래서 우리는 sorted 함수를 사용하여 딕셔너리를 key를 기준으로 정렬할 수 있다. 이에 대한 반환 값은 키 값들의 리스트이므로 딕셔너리 자체를 반환했다고 보기도 어렵고 후처리를 한번더 해야하느 번거로움이 있다.

>>> x = {1:2,3:1,4:4,2:3,0:0}
>>> sorted(x)
[0, 1, 2, 3, 4]

그래서 람다 함수를 이용하여, sorted의 key 매개변수에 key를 기준으로 할지 value로 기준할지를 정하여 정렬할 수 있다. 다만 이 경우도  튜플 쌍을 요소로 갖는 리스트르 반환하니 후처리를 해야하는 것은 매한가지다.

# key로 오름차순 정렬
sorted(x.items(), key=lambda x:x[0])
[(0, 0), (1, 2), (2, 3), (3, 1), (4, 4)]


# value로 오름차순 정렬
sorted(x.items(), key=lambda x:x[1])
[(0, 0), (3, 1), (1, 2), (2, 3), (4, 4)]

 이런식의 후처리를 줄이기 위해 아래와 같은 함축 표현을 이용하면, 한줄로 정렬된 딕셔너리를 반환받을 수 있다.

{k: v for k, v in sorted(x.items(), key=lambda item: item[1])}
# value로 오름차순 정렬

8.3. 딕셔너리의 메소드

메소드 하는 일
keys() 딕셔너리 내의 모든 키를 반환한다.
values() 딕셔너리 내의 모든 값을 반환한다.
items() 딕셔너리 내의 모든 항목을 [키]:[값] 쌍으로 반환한다.
get(key) 키에 대한 값을 반환한다. 키가 없으면 None을 반환한다.
pop(key) 키에 대한 값을 반환하고, 그 항목을 삭제한다. 키가 없으면 KeyError 예외를 발생시킨다.
popitem() 제일 마지막에 입력된 항목을 삭제하고 그 항목을 삭제한다.
clear() 딕셔너리 내의 모든 항목을 삭제한다.

딕셔너리만의 메소드를 제외하면, list나 tuple의 메소드와 유사한 부분이 몇몇있어  외우기 쉽다.


8.4. 람다(Lambda)

익명함수라고도 불리는 람다 함수는 def 와 같은 예약어로 함수를 정의하여 사용하는 것이 아닌, 한번만 사용하고 버리는 함수라고 생각하면 편하다. 함수를 만들지 않고 함수화된 기능만을 불러 사용하고자 할 경우에 사용하면된다.

 

아까와 같이 딕셔너리를 정렬할 때, 각각의 원소들을 불러와서 함수를 적용시킬 때, 이용하면 좋다.

 

람다함수는 한줄로 표현되기 때문에, 함수 내부에 새로운 변수를 정의하는 등의 일을 할 수 없다.


8.5. 집합(Set)

집합 자료형은 동일한 값을 가지는 항목의 중복을 허용하지 않는 자료형이다. 

집합은 인덱스가 없다. 그러므로 인덱싱이나 슬라이싱도 불가하다.

 

리스트로 부터 집합을 생성하는 것도 가능한데, 리스트를 집합으로 변환하는 과정에서 집합의 속성때문에 자동으로 리스트의 중복되는 요소가 제거된다.

>>> set([1, 2, 3, 1, 2])
{1, 2, 3}

문자열도 시퀀스 자료형이라 집합 자료형으로 만들 수 있는데, 집합은 중복을 허용하지 않으므로 중복되는 'a'가 사라진다.

>>> set("abcdefa")
{'e', 'f', 'c', 'a', 'd', 'b'}

집합은 인덱싱은 불가능하지만 시퀀스 자료형이기 때문에 for 문을 이용하여 각 요소에 접근하는 것이 가능하다.

 

집합에 요소를 추가하고 삭제하는 방법은 list와 비슷한데, 다르다.

>>> x = {1,2,3}
>>> x.add(4)
>>> x
{1, 2, 3, 4}

>>> x.remove(1)
>>> x
{2, 3, 4}

append 대신에 add라는 메소드를 이용하니 주의하자.


8.6. 집합의 연산

 집합 비교 연산

>>> A = {1, 2, 3}
>>> B = {1, 2, 3}
>>> A == B 			# A와 B가 같은지 검사
True

>>> A = {1, 2, 3, 4, 5}
>>> B = {1, 2, 3}
>>> B < A 			# B가 A의 진부분 집합인가 검사
True

<, <= 연산자를 사용하여 진부분 집합인지 부분 집합 인지를 알 수 있고,

>, >= 연산자를 이용하면 진상위 집합인지 상위 집한 인지를 알 수 있다.

 항목들에 대한 정보 처리

>>> A = {1, 2, 3, 4, 5, 6, 6}
>>> len(A)     # 중복을 제외하면 6개이다.
6
>>> max(A)    # 가장 큰 수
6
>>> min(A)    # 가장 작은 수
1
>>> sorted(A)    # 정렬하여 리스트로 반환
[1, 2, 3, 4, 5, 6]
>>> sum(A)    # 전체 합
21

 다양한 집합 연산

>>> A = {1, 2, 3}
>>> B = {3, 4, 5}

>>> A | B    # 합집합 연산 
{1, 2, 3, 4, 5}
>>> a.union(B) # 합집합 메소드
{1, 2, 3, 4, 5}

>>> A & B    # 교집합 연산
{3}
>>> A.intersection(B)    # 교집합 메소드
{3}

>>> A - B    # 차집합 연산
{1, 2}
>>> A.difference(B)    # 차집합 메소드
{1, 2}

>>> A ^ B    # 대칭 차집합 연산
{1, 2, 4, 5}
>>> A.symmetric_difference(B) # 대칭 차집합 메소드
{1, 2, 4, 5}

8.7 open()

파이썬에서 파일에 대한 입력과 출력을 open() 함수를 이용하여 다룰 수 있다.]

바로 코드를 보기 전에, 아래 스크립트 코드를 저장하는 같은 경로에 hello.txt 파일을 만들고, 안에 아무 문자열이나 작성하여보자.

f = open('hello.txt', 'r')    # 파일을 읽기 전용으로 연다.
s = f.read()                  # 파일을 읽는다.
print(s)                      # 파일의 내용을 출력한다.
f.close()                     # 파일을 닫는다.

# 실행시 hello.txt 의 내용이 출력됨

open() 함수에서 파일 위치 인자 뒤에, 'r' 은 'read'의 약자로 읽기 모드로 파일을 불러온다는 뜻이고, 파일을 수정하고 저장하기 위해서는 'w'('write')를 인자로 넘겨서 파일을 열어야한다.

f = open('hello.txt', 'w')    # 파일을 읽기 전용으로 연다.
f.write("수정됨")             # 파일을 작성한다.
f.close()                     # 파일을 닫는다.

# 실행시 hello.txt 의 내용이 수정됨으로 바뀔 것이다.
가끔 파일을 열 때, 프로그램이 정상적으로 실행되는데도 글자가 깨지는 경우가 있다. 이때는 인코딩의 문제이므로
open() 함수를 호출할 때, 인자로 어떤 인코딩 방식인지 명시해주면 정상적으로 읽어질 것 이다. [참고]

 

Comments