Python의 dictionary 와 set 데이터 타입에 대해 정리합니다.
개요
- 데이터 타입중 ‘dictionary’ 와 ‘set’ 과 관련된 다양한 기능을 정리합니다.
dictionary
-
키(key)와 값(value)을 갖는 데이터 구조
-
순서를 따지지 않음. 즉, 인덱스가 없음
-
하지만, 키는 내부적으로 hash값으로 저장 -> 즉, 키값이 index와 비슷한 역할을 한다.
-
빈 dic는 {}으로 생성할 수 있다.
1
2
3
4
5
a = {'Korea': 'Seoul',
'Canada': 'Ottawa',
'USA': 'Washington D.C'}
print(a)
print(type(a))
{'Korea': 'Seoul', 'Canada': 'Ottawa', 'USA': 'Washington D.C'} <class 'dict'>
- 순서를 따지지 않음. 즉, 인덱스가 없음
입력한 순서대로 출력한 것 같지만, 인덱스 상으로 정해진 순서는 없다.
즉, list 처럼 인덱싱을 통해 특정 위치의 값만 뽑아낼 수가 없다.
1
print(a[0]) # 의도는 'Korea': 'Seoul' 을 뽑는 것.
- 빈 dic는 {}으로 생성할 수 있다.
1
2
b = {}
type(b)
dict
- 하지만, 키는 내부적으로 hash값으로 저장 -> 즉, 키값이 index와 비슷한 역할을 한다.
인덱싱을 불가능하지만, key값을 알면 인덱싱 처럼 원하는 위치의 값을 찾아서 출력할 수 있다.
1
print(a['Korea'])
Seoul
숫자로 된 형식일 경우 인덱싱과 헷갈릴 수 있으니 주의 해야 한다.
1
2
3
4
5
6
b = {0:1, 1:6, 7:9, 8:10}
print(b[0])
#인덱스로 0번째 값이어서 출력된 것이 아니다.
# 0이라는 key값을 가진 value가 있었기 때문에 출력 된 것.
1
1
print(b[2]) # b에는 2라는 key값이 없기 때문에 출력되지 않고 에러가 발생한다.
항목 추가 및 변경
-
기존에 키가 존재 하면, 새로운 값으로 업데이트
-
존재하지 않으면, 새로운 키, 값 생성
1
2
3
4
5
6
a = {'Korea': 'Seoul',
'Canada': 'Ottawa',
'USA': 'Washington D.C'}
a['Japan'] = 'Tokyo' # Japan 이라는 key가 없으므로 새로운 key : value가 추가된다.
print(a)
{'Korea': 'Seoul', 'Canada': 'Ottawa', 'USA': 'Washington D.C', 'Japan': 'Tokyo'}
1
2
a['Japan'] = 'Kyoto' # 위에서 추가된 Tokyo가 Kyoto로 업데이트 된다.
print(a)
{'Korea': 'Seoul', 'Canada': 'Ottawa', 'USA': 'Washington D.C', 'Japan': 'Kyoto'}
1
2
a['Japan2'] = 'Kyoto' # Japan2라는 새로운 key에 Kyoto로 추가된다.
print(a)
{'Korea': 'Seoul', 'Canada': 'Ottawa', 'USA': 'Washington D.C', 'Japan': 'Kyoto', 'Japan2': 'Kyoto'}
key는 중복이 되면 해당되는 value가 업데이트 되지만, value는 겹치는 값이 있어도 key값만 다르다면 상관 없다.
1
2
3
a['China'] = 'Beijing' # China라는 key가 없으므로 새로운 key : value가 추가 된다.
print(a)
{'Korea': 'Seoul', 'Canada': 'Ottawa', 'USA': 'Washington D.C', 'Japan': 'Kyoto', 'Japan2': 'Kyoto', 'China': 'Beijing'}
update()
-
두 딕셔너리를 병합함
-
겹치는 키가 있다면 parameter로 전달되는 키 값이 overwrite된다.
1
2
3
4
5
6
7
8
a = {'a': 1, 'b': 2, 'c' : 3}
b = {'a': 2, 'd': 4, 'e': 5}
# a와 b에 모두 a라는 key가 존재 한다.
a.update(b) # b가 파라미터이다.
print(a)
{'a': 2, 'b': 2, 'c': 3, 'd': 4, 'e': 5}
key삭제
-
del 키워드 사용
-
pop 함수 이용
1
2
a = {'a': 1, 'b': 2, 'c' : 3}
print(a)
{'a': 1, 'b': 2, 'c': 3}
a 변수에서 특정 key값을 지우는 방법
1) del 키워드 사용
1
2
del a['b']
print(a)
{'a': 1, 'c': 3}
2) pop() 함수 사용
1
2
a.pop('c')
print(a)
{'a': 1}
clear()
- 딕셔너리의 모든 값을 초기화
1
2
a = {'a': 1, 'b': 2, 'c' : 3}
print(a)
{'a': 1, 'b': 2, 'c': 3}
1
2
a.clear()
print(a)
{}
in
-
key값 존재 확인
-
O(1) 연산 - 딕셔너리의 크기와 관계없이 항상 연산의 속도가 일정하다는 의미
1
2
3
a = {'a': 1, 'b': 2, 'c' : 3}
'b' in a # b라는 key가 a에 있는가? -> T/F 로 결과가 나온다.
True
in 은 list나 dict모두에서 사용가능하지만 성능차이가 있다.
1
2
3
4
5
6
a = {'a': 1, 'b': 2, 'c' : 3} # dict
b = [1, 2, 3, 4, 5, 6, 7, 9, 10, 100] # list
print(100 in b)
print('b' in a)
print(2 in a) # a에서 2는 key가 아닌 value이기 때문에 in 함수 기준으로 봤을때는 False가 된다.
True True False
-
dict는 원소의 개수에 상관없이 ‘b’라는 key값이 있는지 바로 결과를 출력할 수 있다. (연산 속도가 동일)
-
list는 원소의 개수가 많아진다면, 결과값을 출력하는데 시간이 오래 걸린다.
value access
-
dict는 항상 [key]로 접근, 키가 없는 경우 에러 발생
-
value로 접근하고 싶다면 ‘get() 함수’ 를 사용하면 된다. 단, 키가 없는 경우 None반환한다.
1
2
3
a = {'a': 1, 'b': 2, 'c' : 3} # dict
print(a.get('d'))
None
1
print(a['d'])
1
2
3
4
5
6
7
8
# 이후에 정리할 if문을 활용해서 에러의 출력을 없앨 수도 있다.
if 'd' in a:
print(a['d'])
# a라는 dict에 d라는 key가 있다면 아래의 print()를 실행하라.
None
모든 keys, values 접근
-
keys() - 키만 반환
-
values() - 값만 반환
-
items() - 키, 값의 튜플을 반환
1
2
3
4
5
6
7
8
print(a) # dict의 모든 값 반환
print(list(a.keys())) # Key값만 반환 by list
print(list(a.values())) #value들만 반환 by list
# key와 value를 모두 반환 by tuple 형태
list(a.items())
{'a': 1, 'b': 2, 'c': 3} ['a', 'b', 'c'] [1, 2, 3]
[('a', 1), ('b', 2), ('c', 3)]
set
-
dictionary에서 key만 활용하는 데이터 구조로 이해
-
수학에서의 집합과 동일한 개념
-
자주 사용되는 개념은 아니다.
-
dict와 마찬가지로 {}로 설정할 수 있다.
-
set()로 빈 set를 생성할 수 있다.
-
dict와 마찬가지조 인덱싱이 되지 않는다 = 순서가 없다.
-
중복값은 허용하지 않는다.
1
2
a = {1, 1, 2, 3, 3, 4, 1, 5}
print(a)
{1, 2, 3, 4, 5}
1
print(a[0])
set()으로 집합으로 변환
1
2
3
a = [1, 1, 2, 3, 3, 4, 1, 5]
print(a)
print(type(a))
[1, 1, 2, 3, 3, 4, 1, 5] <class 'list'>
1
2
3
b = set(a) # 중복되는 값인 3이 사라지고 1개만 남는다.
print(b)
print(type(b))
{1, 2, 3, 4, 5} <class 'set'>
set operations
-
수학 연산과 동일
-
교집합, 합집합, 차집합 등 지원
1
2
3
4
a = {1, 2, 3}
b = {2, 3, 4}
print(a.union(b)) # 합집합
{1, 2, 3, 4}
1
print(a.intersection(b)) # 교집합
{2, 3}
1
print(a.difference(b)) # 차집합
{1}
1
print(a.issubset(b)) #부분 집합
False
1
2
3
4
a = {1, 2, 3}
b = {1, 2, 3, 4}
print(a.issubset(b)) #부분 집합
True
댓글남기기