이전에 List와 Tuple을 다뤄 봤습니다. 이 둘은 값의 나열을 다루며, 순서가 보장되기 때문에 인덱싱과 슬라이싱이 가능했죠. 이번에 다뤄 볼 Dictionary와 Set도 Iterable 자료형이지만, List나 Tuple과는 조금 다릅니다.

Dictionary

Dictionary는 Key-value 쌍으로 표현되는 자료형입니다. 사람에 대한 정보는 이름=조민규, 닉네임=PlanB처럼 표현할 수 있듯, Dictionary라는 단어의 뜻처럼 사전처럼 데이터를 관리합니다.

d = {}
# 빈 딕셔너리
d = {'name': '조민규', 'nickname': 'PlanB'}
# 중괄호로 감싸고, 각 쌍은 key: value 형태로 정의하며, 쉼표로 구분
d = {1: 10, 2: 20}
# key는 불변 자료형, value는 어떤 자료형이든 사용할 수 있음
d = {'info': {'name': '조민규', 'nickname': 'PlanB'}}
# 다중 딕셔너리
print(d)
# {'info': {'name': '조민규', 'nickname': 'PlanB'}}
view raw dict.py hosted with ❤ by GitHub

값 조회하기

List와 Tuple은 인덱스로 값을 조회했던 것에 비해, 딕셔너리는 key를 통해 값을 조회합니다.

d = {'name': '조민규', 'nickname': 'PlanB'}
print(d['name'])
# '조민규'
d = {1: 10, 2: 20}
# key가 int형인 경우
print(d[1])
# 10
d = {'info': {'name': '조민규', 'nickname': 'PlanB'}}
# 다중 딕셔너리
print(d['info']['name'])
# '조민규'

값 추가, 수정, 제거하기

Dictionary는 값 추가, 수정, 제거가 자유롭습니다.

d = {}
d['name'] = '조민규'
d['nickname'] = 'PlanB'
# 요소 추가
d['nickname'] = 'PlanC'
# 요소 수정
del d['nickname']
# 요소 제거

Set

Set은 수학의 집합과 비슷한 자료형입니다. 중복을 허용하지 않고, 순서가 없습니다. 사실 수학의 집합 개념을 사용하거나, 중복을 제거하는 용도가 아니면 자주 사용하지는 않습니다.

s = set()
# 빈 집합
# Set도 딕셔너리처럼 중괄호를 사용하는데, {}의 경우 딕셔너리로 추론되기 때문에 set() 사용
s = {1, 2, 3, 3}
print(s)
# {1, 2, 3}
# 중복이 제거됨
s2 = {1, 2, 5}
print(s & s2)
# {1, 2}
# 교집합
print(s | s2)
# {1, 2, 3, 5}
# 합집합
print(s - s2)
# {3}
# 차집합
view raw set.py hosted with ❤ by GitHub

값 추가, 수정, 제거하기

Set은 Tuple과 다르게 mutable(가변) 자료형이기 때문에 값을 자유롭게 추가, 수정, 제거할 수 있습니다. 그러나 다른 iterable 자료형에 비해 문법적으로 조금 다릅니다.

s = {1, 2, 3}
s.add(4)
print(s)
# {1, 2, 3, 4}
s.update([4, 5])
print(s)
# {1, 2, 3, 4, 5}
s.remove(4)
print(s)
# {1, 2, 3, 5}
view raw set-crud.py hosted with ❤ by GitHub

List에서 중복된 값 없애기

Set은 중복을 허용하지 않기 때문에, List와 같은 자료형에서 중복된 값을 없애기 위해서 자주 사용됩니다.

l = [1, 2, 3, 3, 4, 5, 5]
l = list(set(l))
# set으로 캐스팅하여 중복을 제거하고, list로 다시 캐스팅
print(l)
# [1, 2, 3, 4, 5]

문자열 이야기

문자열도 Iterable이며 순서가 보장되는 자료형입니다. 따라서 인덱싱과 슬라이싱, 합과 곱 연산이 가능합니다.

s = 'PlanB'
# Indexing
print(s[2])
# 'a'
# Slicing
print(s[3:])
# 'nB'
# +
print(s + '!!')
# 'PlanB!!'
# *
print(s * 2)
# 'PlanBPlanB'

Unpacking

Iterable에는 unpacking이라는 개념이 있습니다. 객체의 각 요소들을 풀어 변수에 대입하는 것입니다. Python 3에는 확장 언패킹(extended unpacking)이라는 개념도 존재합니다.

a, b, c, d = [1, 2, 3, 4]
print(a)
# 1
print(b)
# 2
print(c)
# 3
print(d)
# 4
a, *b, c = [1, 2, 3, 4, 5]
# Python 3의 확장 언패킹(extended unpacking)
print(a)
# 1
print(b)
# [2, 3, 4]
print(c)
# 5
view raw unpacking.py hosted with ❤ by GitHub

Unpacking의 반대 개념으로 packing이 있는데, 사실 우리가 위에서 Iterable 객체에 리터럴로 값을 대입했던 것들이 모두 packing에 속합니다.

l = [1, 2, 3, 4]
t = 1, 2, 3, 4
d = {1: 10, 2: 20}
s = {1, 2, 3, 4}
view raw packing.py hosted with ❤ by GitHub

타입 캐스팅

Iterable 타입 간 타입 캐스팅도 자유롭습니다. 단, list/tuple/set을 dictionary로 캐스팅할 수는 없습니다.

# - list를 캐스팅
l = [1, 2, 3, 4]
print(tuple(l), set(l))
# (1, 2, 3, 4) {1, 2, 3, 4}
# - tuple을 캐스팅
t = 1, 2, 3, 4
print(list(t), set(t))
# [1, 2, 3, 4] {1, 2, 3, 4}
# - set을 캐스팅
s = {1, 2, 3, 4}
print(list(s), tuple(s))
# [1, 2, 3, 4] (1, 2, 3, 4)
# - dictionary를 캐스팅
d = {1: 10, 2: 20}
print(list(d), tuple(d), set(d))
# [1, 2] (1, 2) {1, 2}
# key들만 추출

Iterable 타입의 참과 거짓

Iterable 타입의 참과 거짓을 판단하는 기준은 정말 간단합니다. 비어 있으면 False, 비어 있지 않으면 True입니다.

'Python 계열 > Python 레거시 글' 카테고리의 다른 글

[Python] 반복문 - for  (0) 2018.06.22
[Python] 조건문 - if  (0) 2018.06.21
[Python] Iterable 자료형 - List, Tuple  (1) 2018.06.19
[Python] 변수와 기본 자료형  (0) 2018.06.18
[Python] 주석  (0) 2018.06.17

+ Recent posts