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

댓글남기기