본문 바로가기

[부스트코스 코칭스터디]

[부스트코스] 모두를 위한 파이썬(PY4E) 딕셔너리, 튜플, 셋

이 글은 네이버 커넥트 재단에서 운영하는 부스트 코스 코칭 스터디 (모두를 위한 파이썬 2022) 과정에 부스터로 참여 하여 배운 내용을 정리 한 글이다.

추가적인 공부를 원하면 해당 강좌를 통해 공부가 가능하다.

 

 

강좌링크 : [https://www.boostcourse.org/cs122]
강좌명 : 모두를 위한 파이썬(PY4E)

저번 포스팅에서는 컬렉션의 리스트에 대해 다루어 보았다. 이 포스팅을 보기전에 리스트에 대해 공부하는 것을 추천한다. 이번 시간에는 나머지 딕셔너리, 튜플, 셋의 각각의 특성에 대해 알아보고 활용하는 방법을 공부하겠다.

 

 

딕셔너리

리스트는 인덱스를 통해 값을 불러왔다면 딕셔너리는 키를 통해 값을 불러온다.
딕셔너리는 키값만 알고 있다면 바로 키에 해당하는 값을 불러올 수 있다는 점에서 유용하다.
딕셔너리에서 는 하나의 자료를 말한다고 생각하면 편하다. 는 문자열이나 숫자가 올 수도 있으며 다양한 데이터를 저장 할 수 있다.

다른 언어에서도 이와 비슷한 것을 지원하는데 java에서는 HashMap와 비슷하다.

딕셔너리를 사용하기 위해서는 dict() 함수 또는 중괄호({})를 사용해서 구현할 수 있다.

 

age = dict()
food['James'] = 12
food['Lucas'] = 32
print(age)
--------------------------
{'James': 12, 'Lucas': 32}

이처럼 {} 중괄호 안에 키 : 값의 형태로 데이터가 들어온 것을 알 수 있다.
그러면 각각 저장한 값을 불러와 사용해 보겠다.

 

age = {'James': 12, 'Lucas': 32, 'Liam': 19}
print(age['James'])
-----------------------------
12

딕셔너리로 키와 값을 넣어 준 뒤 딕셔너리의 키로 값을 구해 보았다.
리스트는 인덱스를 값을 불러온 반면 딕셔너리는 키를 넣어 값을 구했다는 점이 다르다.

 

 

딕셔너리의 활용

딕셔너리를 유용하게 사용하는 방법 중 하나로는 카운트 하는 것이 있다.
여러 중복된 데이터를 동일한 키값에 저장하여 카운트 하는 것이다.

예를 들어 주소록의 전화가 걸려온 횟수를 전화 기록 데이터만으로 구하고자 한다면 딕셔너리를 활용해 키를 전화번호를 설정하고 전화기록에 해당 전화번호가 있을 때마다 카운트 하여 전화가 걸려온 횟수를 전화번호 별로 구할 수 있다.

딕셔너리도 마찬가지로 리스트가 인덱스에 값이 있어야 사용할 수 있었던 것과 비슷하게
딕셔너리에 키가 있어야 해당 값을 사용할 수 있다.

age = {'James': 12, 'Lucas': 32, 'Liam': 19}
print(age['Romio'])
-------------------
KeyError: 'Romio'

이처럼 딕셔너리에 없는 키로 접근시 키 에러가 일어난다.

파이썬에서는 get() 함수를 통해 딕셔너리에 구하고자 하는 키가 있는 지 확인하고 키가 없으면 해당 키를 값과 함께 넣어줄 수 있다.
딕셔너리변수.get(키값, 기본으로 설정할 값)을 설정하여
여기서 잘 알아두어야 할 것이 딕셔너리 내부에 키가 있으면 아무런일을 하지 않는다.

무슨 뜻인지 코드를 통해 확인해 보겠다.

 

foods = ['pizza', 'chicken', 'gimchi','chicken']
counts = dict()
for food in foods:
    counts[food] = counts.get(food, 0) + 1
print(counts)
----------------------------------------
{'pizza': 1, 'chicken': 2, 'gimchi': 1}

이 코드는 foods라는 리스트의 값들을 반복문을 통해서 food 변수에 할당한 뒤 리스트의 모든 자료를
딕셔너리 countsfood라는 키가 있으면 1이라는 값을 더하고
없으면 'food' 변수에 들어있는 키를 추가해 0이라는 값을 저장하는 코드이다.

 

 

딕셔너리의 키와 값

딕셔너리는 저장된 키와 값을 키만 구하거나 값만 구하거나 아니면 키와 값 두개를 구하는 함수를 갖고 있다.

age = {'James': 12, 'Lucas': 32, 'Liam': 19}
print(age.keys())           # 키 반환 함수
print(age.values())            # 값 반환 함수
print(age.items())          # 키, 값 반환 함수
---------------------------
dict_keys(['James', 'Lucas', 'Liam'])
dict_values([12, 32, 19])
dict_items([('James', 12), ('Lucas', 32), ('Liam', 19)])

이 값들은 전부 리스트에 담아 반환한다. 키와 값은 따로 리스트에 저장할 수 없기 때문에 튜플의 형태로 저장된 뒤
리스트의 형태로 반환한다. 이는 조금 이따가 튜플에 대해 배울 때 따로 설명하겠다.

 

 

튜플

튜플도 리스트와 비슷하게 0부터 시작하는 인덱스를 가지고 이를 통해 값을 불러 올 수 있다.
그러나 리스트는 인덱스를 통해 값을 바꿀 수 있지만 튜플은 값을 한번 저장하면 바꿀 수 없다는 차이가 있다.
튜플은 tuple() 함수를 사용하거나 ()를 사용하거나 ,괄호를 생략해 콤마로 구현할 수 있다.

foods = ('pizza', 'chicken', 'gimchi','chicken')
foods[3] = 'ramen'
----------------------------------------------
TypeError: 'tuple' object does not support item assignment

이처럼 한번 선언된 값은 변환, 추가, 삭제가 불가능 하고 또한 리스트의 강력한 기능인 정렬 또한 불가능 하다.

그러나 튜플은 수정이 불가하기 때문에 컴퓨터가 자료를 처리하기에 메모리 사용량과 성능 측면에서 매우 효과적이다.
변하지 않는 일정한 값을 사용하려면 리스트보다 튜플을 사용하는 것이 좋다.

 

 

튜플의 비교

튜플은 비교연산자를 통해서 서로 비교가 가능하다. 첫번째 인덱스부터 다른 요소가 있을 때까지 비교를 계속한다.
이를 활용해 튜플로 이루어진 리스트를 정렬할 수 있다.

아까 배운 items()(키와 값이 튜플로 이루어진 리스트 반환함)를 이용해 sorted()로 정렬 시킬 수 있다.

age = {'Aames': 12, 'Cucas': 32, 'Diam': 19, 'Bear': 12}
ageList = sorted(age.items())
print(ageList)
------------------------------------------
[('Aames', 12), ('Bear', 12), ('Cucas', 32), ('Diam', 19)]

이렇게 알파벳 순으로 정렬 할 수 있다. 알파벳은 대문자를 먼저 소문자를 나중에 하고 이를 비교한다.

 

 

딕셔너리와 튜플 응용

딕셔너리와 튜플을 반복문을 이용해 키와 값을 변환시킨 후 정렬 하는 등 여러 작업을 할 수 있다.

ageList = {'Aames': 12, 'Cucas': 32, 'Diam': 19, 'Bear': 12}
nameList = list()
for name, age in ageList.items():
    nameList.append((age,name))
print(sorted(nameList))
-----------------------------------
[(12, 'Aames'), (12, 'Bear'), (19, 'Diam'), (32, 'Cucas')]

위 코드는 딕셔너리를 items() 함수를 이용해서 각각 name은 키, age는 값을 전달 받아 각각 키와 값의 위치를 변환 시킨 후
nameList라는 리스트 변수에 추가한후 정렬한뒤 출력하였다. 이렇게 하면 각각의 숫자를 기준으로 정렬 할 수 있다.

 

 

셋은 중복되지 않은 값을 구하고자 할 때 사용한다.
구현은 딕셔너리와 헷갈릴 수 있는데 그이유는 {데이터}형태를 가지기 때문이다.
딕셔너리는 키와 값을 저장 했던 반면 셋은 원소 자체만을 가진다.
또는 주로 set()함수를 통해 구현 할 수 있다.

 

foods = set(['pizza', 'chicken', 'gimchi','chicken'])
print(foods)
---------------------------------------
{'pizza', 'chicken', 'gimchi'}

 

위의 결과 값을 볼 수 있듯이 리스트 안의 'chicken'은 하나만 저장 되었다.
또한 여러 집합에 대한 것들도 다룰 수 있겠끔 set에서 지원하니 궁금하면 찾아 보길 바란다.

 

 

 

 

 

이것으로 컬렉션에 대한 정리를 마치겠다.
다음 포스팅에는 부스트코스 코칭스터디에 대한 소개와 그동안 코칭스터디를 하면서 도움이 되었던 것들을 소개하면서 마무리하겠다.