Programming/Pyhton

파이썬: 딕셔너리(dictionary), 셋(set)

JunsuKim 2022. 7. 22.
728x90

딕셔너리(dirtionary)

딕셔너리는 리스트와 비슷하다.

다른 점은 항목의 순서를 따지지 않고, 오프셋을 이용해서 항목을 선택할 수 없다.

대신 값에 상응하는 고유한 키를 지정한다.

딕셔너리는 다른 언어들의 맵(map)과 같다.

맵과 같이 "키(key) - 값(value)" 쌍을 요소로 갖는 컬렉션이다.

딕셔너리 생성하기: { }

딕셔너리를 생성하기 위해서는 중괄호({ }) 안에 콤마로 구분된 키 : 값 쌍을 지정한다.

{ } 안에 아무 값도 없다면 빈 딕셔너리이다.

>>> empty_dict = {}
>>> empty_dict
{}

>>> dict = {1: 2, 2: 4, 4: 8}
>>> dict
{1: 2, 2: 4, 4: 8}

딕셔너리로 변환하기: dict( )

dict() 함수를 사용하면 두 값으로 이루어진 시퀀스를 딕셔너리로 변환할 수 있다.

각 시퀀스의 첫 번째 항목은 키(key)가 되고, 두 번째 항목은 값(value)이 된다.

# 리스트로 구성된 리스트 a를 딕셔너리로 변환
>>> a = [['a', 'b'], ['c', 'd'], ['e', 'f']]
>>> dict(a)
{'a': 'b', 'c': 'd', 'e': 'f'}

# 튜플로 구성된 리스트 a를 딕셔너리로 변환
>>> a = [('a', 'b'), ('c', 'd'), ('e', 'f')]
>>> dict(a)
{'a': 'b', 'c': 'd', 'e': 'f'}

# 두 문자 문자열로 된 리스트 a를 딕셔너리로 변환
>>> a = ['ab', 'cd', 'ef']
>>> dict(a)
{'a': 'b', 'c': 'd', 'e': 'f'}

# 두 문자 문자열로 된 튜플 a를 딕셔너리로 변환
>>> a = ('ab', 'cd', 'ef')
>>> dict(a)
{'a': 'b', 'c': 'd', 'e': 'f'}

항목 추가 / 변경하기: [key]

딕셔너리에 항목을 추가 및 변경하는 방법은 간단하다.

키에 의해 참조되는 항목에 값을 할당하면 된다.

키가 딕셔너리에 이미 존재하는 경우라면, 그 값은 새 값으로 대체된다.

키가 존재하지 않는다면, 새 값이 키와 함께 딕셔너리에 추가된다.

리스트와의 차이점으로 할당할 때, 인덱스 범위 지정에 신경쓰지 않아도 된다.

>>> a = {1: 'a'}
>>> a[2] = 'b'
>>> a 
{1: 'a', 2: 'b'}

>>> a[1] = 'c'
>>> a
{1: 'c', 2: 'b'}

딕셔너리 결합하기: update( )

update() 함수는 한 딕셔너리의 키와 값들을 복사해서 다른 딕셔너리에 붙여준다.

형태는 다음과 같다.

기존 딕셔너리.update(업데이트값을 가진 딕셔너리)

즉, 여러 값을 동시에 추가 및 변경해야할 때 사용하면 유용할 것이라 생각한다.

>>> a = {'a': 'b', 'c': 'd', 'e': 'f'}
>>> b = {'a': 1, 'c': 'h', 'f': 'g'}
>>> a.update(b)
>>> a
{'a': 1, 'c': 'h', 'e': 'f', 'f': 'g'}

이처럼 키가 기존의 딕셔너리에 있다면 값이 변경되고,

기존의 딕셔너리에 없는 키라면, 키와 값 쌍이 추가된다.

항목 삭제하기

딕셔너리는 키와 del 함수를 사용해서 항목을 삭제할 수 있다.

위에서 사용했던 업데이트 된 a 배열을 예시로 보자.

맨 뒤의 항목인 'f': 'g'를 삭제할 것이다.

>>> del a['f']
>>> a
{'a': 1, 'c': 'h', 'e': 'f'}

모든 항목을 삭제하는 함수도 있다. 바로 clear() 함수이다.

clear() 함수를 사용하면 딕셔너리에 있는 모든 키와 값을 삭제한다.

>>> a.clear()
>>> a 
{}

딕셔너리에 키가 존재하는지 확인: in

in을 사용하면 딕셔너리에 키가 존재하는지 확인할 수 있다.

>>> a = {'a': 'b', 'c': 'd', 'e': 'f'}
>>> 'a' in a
True

>>> 'g' in a
False

값(value) 얻기: [key]

딕셔너리에 키를 지정하여 상응하는 값을 얻는다.

>>> a['a']
'b'

딕셔너리에 찾고자 하는 키가 존재하지 않는다면 예외가 발생하게 된다.

이러한 예외를 피하기 위한 방법으로 get( ) 함수를 사용하는 방법도 있다. 

[key]와 동일하게 get(key)를 통해 값(value)를 얻는다.

>>> a.get('a')
'b'

만약 딕셔너리에 키가 없다면 옵션값을 지정해서 이를 출력할 수 있다.

옵션값을 지정하지 않았다면 None이 출력된다.

>>> a = {'a': 'b', 'c': 'd', 'e': 'f'}
>>> a.get('f', 'dictionary haven't this element')
'dictionary haven't this element'

>>> a.get('f')
None

모든 키 얻기: keys( )

keys() 함수를 사용하면 딕셔너리의 모든 키를 가져올 수 있다.

이 때 키들은 dict_keys() 형태로 반환된다.

>>> a = {'a': 'b', 'c': 'd', 'e': 'f'}
>>> a.keys()
dict_keys(['a', 'c', 'e'])

모든 값 얻기: values( )

keys() 함수와 같이 values()함수는 딕셔너리의 모든 값을 가져오기 위해 사용된다.

>>> a = {'a': 'b', 'c': 'd', 'e': 'f'}
>>> a.values()
dict_values(['b', 'd', 'f'])

모든 쌍의 키-값 얻기: items( )

item() 함수를 사용하면 모든 쌍의 키와 값을 얻을 수 있다.

각 키와 값은 튜플로 반환된다.

>>> a = {'a': 'b', 'c': 'd', 'e': 'f'}
>>> a.items()
dict_items([('a', 'b'), ('c', 'd'), ('e', 'f')])

복사: copy( )

리스트와 마찬가지로 딕셔너리를 할당한 후 변경할 때 딕셔너리를 참조하는 모든 이름에 변경된 딕셔너리를 반영한다.

따라서 copy 함수를 사용해 새로운 항목을 가진 딕셔너리를 만들어준다.

>>> a = {'a': 'b', 'c': 'd', 'e': 'f'}
>>> b = a.copy()
>>> a['a'] = 1
>>>b
{'a': 'b', 'c': 'd', 'e': 'f'}

셋(Set)

셋은 값은 버리고 키만 남은 딕셔너리와 같다.

딕셔너리와 마찬가지로 각 키는 유일해야 한다.

어떤 것이 존재하는지 여부만 판단하기 위해서는 셋을 사용한다.

만일 셋에 같은 값을 2번 넣는다면, 첫 번째 값은 셋에 잘 들어가겠지만, 두 번째 값은 생략된다.

셋 생성하기

셋을 생성할 때는 set( ) 함수 혹은 중괄호({ }) 안에 콤마로 구분된 하나 이상의 값을 넣으면 된다.

>>> empty_set = set()
>>> empty_set
set()

>>> even_num = {0, 2, 4, 6, 8}
>>> even_num
{0, 2, 4, 6, 8}

딕셔너리와 마찬가지로 set 또한 순서가 없다.

데이터 타입 변환하기

set( )함수는 셋을 생성할 때 뿐만이 아닌 데이터 타입을 변환할 때도 사용된다.

>>> set('letters')
{'1', 'e', 't', 'r', 's'}

>>> set(['a', 'b', 'c', 'd'])
{'a', 'b', 'c', 'd'}

첫 번째 예시를 보면 e와 t가 두개이지만 한개씩만 들어간 것을 확인할 수 있다.

이처럼 셋에는 같은 요소가 들어가려 하면 생략된다.

예시에는 문자열과 리스트밖에 없지만, 튜플과 딕셔너리도 사용이 가능하다.

딕셔너리에 set()을 사용하면 키 값만 사용된다.

>>> set({'apple': 'red', 'orange': 'orange', 'cherry': 'red'})
{'apple', 'orange', 'cherry'}

교집합, 차집합, 합집합 구하기

>>> s1 = {1, 2, 3, 4, 5}
>>> s2 = {3, 4, 5, 6, 7}

위와 같은 함수들이 있다고 하자.

교집합을 구하는 방법으로는 &연산자를 쓰거나, intersection() 함수를 쓰면 된다.

>>> s1 & s2
{3, 4, 5}

>>> s1.intersection(s2)
{3, 4, 5}

합집합을 구할 때는 | 연산자 또는 union() 함수를 사용한다.

>>> s1 | s2
{1, 2, 3, 4, 5, 6, 7}

>>> s1.union(s2)
{1, 2, 3, 4, 5, 6, 7}

마지막으로 차집합이다.

차집합은 - 연산자 또는 difference() 함수를 사용한다.

>>> s1 - s2
{1, 2}

>>> s1.difference(s2)
{1, 2}

>>> s2 - s1
{6, 7}

>>> s2.difference(s1)
{6, 7}

이처럼 앞에 있는 요소에서 뒤에 있는 요소와의 합집합을 뺀 값을 출력한다.

728x90

댓글