▼2020년/파이썬 기초

[Python] 파이썬에서의 자료형, 딕셔너리형 (5/7)

ITISIK 2020. 1. 22. 09:22
반응형

  지난 포스트에서는 리스트 형태를 거의 닮은 튜플형에 대해서 간단히 공부했었다. 이번 포스트에서는 API 사용시 많이 만나볼 수 있는 딕셔너리 자료형에 대해서 알아보려고 한다. 물론 API가 아니어도 프로그래밍 곳곳에서 만나볼 수 있다.

 

딕셔너리형(사전형)을 굳이 배우고 사용해야하는 이유

  딕셔너리형(사전형)은 개인적으로 가장 좋아하는 자료형이다. 우선 이 자료형이 필요한 이유부터 느껴보도록 하자.

my_list = ["ITisIK", 1994, 12, 19, "Male"]

  위 리스트에서 '성별'을 추출하려면 어떻게 해야할까?

 

  이전의 자료형들에 대해서 착실하게 공부한 분들께서는 my_list[4]와 비슷한 형태를 통해서 값을 취할것이다.

 

  그럼 이런 문제는 어떠신가?

my_list_all = ["ITisIK", 1994, 12, 19, "Male", "NoSmoke", "beer", "A", "RH+", 183, 75, 1.3, 1.3, "Seoul", "math", "statistics", "computer engineering", "MSI"]

  위 리스트에서 거주지(seoul)를 추출하려면 어떻게 해야할까?

  이번에도 0, 1, 2, 3, ... 세어서 서울이 몇 번째인지 찾아내야만 할까?

  정말 그렇게 힘들게 정답을 얻어내야만 할까?(정답 : my_list_all[13])

 

  이럴 때 유용하게 사용할 수 있는 자료형이 바로 사전형이다. 사전형은 my_list_all과 같이 각 정보들이 그 의미를 담고 있을 때 게다가 그 양이 많을때 유용하게 사용할 수 있다. 위의 my_list_all을 딕셔너리형으로 바꾸면 아래와 같다.

my_info = {"name" : "ITisIK",
           "birth_year" : 1994,
           "birth_month" : 12,
           "birth_day" : 19,
           "sex" : "Male",
           "is_smoker" : "False",
           "fav_liquor" : "beer",
           "blood_type" : "A",
           "RH" : "RH+",
           "height" : 183,
           "weight" : 75,
           "visionL" : 1.3,
           "visionR" : 1.3,
           "residence" : "Seoul",
           "major" : "math",
           "double major" : "statistics",
           "minor" : "computer engineering",
           "notebook_brand" : "MSI"}

 

딕셔너리형에서의 데이터 접근법1(인덱싱)

  사실 딕셔너리형에서 값을 취하는 방법은 결국 Key를 이용하는 방법뿐이다. 위와 같이 사전형으로 선언 및 할당해두면, 아래와 같이 품격있는 코드 한 줄로 거주지를 추출해낼 수 있다.

my_info['residence']
# Seoul

  이렇게 거주지를 추출하는데 있어서, 그 자료값이 몇 번째에 있는지 고민하지 않고 오로지 '거주지(Residence)'라는 키워드(Key) 하나만으로 Seoul이라는 값(Value)을 알 수 있도록 구성되어 있는 자료형을 딕셔너리형이라고 하는 것이다.

 

딕셔너리형에서의 데이터 접근법2(get() 함수)

  위와 같이 대괄호를 이용하여 인덱싱하는 방법 외에도, 딕셔너리형에 자체적으로 내장된 get() 함수를 이용하는 방법이 있다. 두 방법에 차이가 있다면, 인덱싱 통해서 존재하지 않는 키를 호출한 경우 에러를 반환하는 반면, get() 함수를 통해서 존재하지 않는 키를 호출한 경우 반환할 값이 없다고 말한다.(None을 반환한다.) 여기서 None은 문자형이 아니고, '아무것도 존재하지 않는다.'는 무(無)의 의미로 받아들이면 된다. 다른 언어에서의 null과 동일하다. 두 가지 방법 중 어떤 것은 사용할지는 철저하게 프로그래머(또는 분석가)의 몫이다.

my_info['height']
# 183

my_info['coffee']
# Error


my_info.get('height')
# 183

my_info.get('coffee')
#

print(my_info.get('height'))
# 183

print(my_info.get('coffee'))
# None

Key-Value(키-벨류)쌍

  이러한 Key-Value 형태를 보기 좋게 정리하면 아래와 같다.

dic = {key1 : value, key2 : value, key3 : value, ...}
# 여기서 key#들은 변하지 않는 값만 사용할 수 있다.

error = {['list'] : ['list1', 2, 'list3']}
# Key에 변할 수 있는 리스트 형이 왔기 때문에 에러가 난다.

  이렇게 Key와 Value가 하나의 묶음으로 이루어져 있기 때문에 Key-Value 쌍이라고 부른다.

 

Key-Value 쌍 추가하기

  이미 만들어져 있는 딕셔너리형에 새로운 키벨류쌍(Key-Value pairs)을 추가하려고 한다.

kv_pairs_ex1 = {'name' : '홍길동'}

kv_pairs_ex1['age'] = 27
# 'age'라는 Key에 27이라는 숫자형 Value를 추가하는 코드

kv_pairs_ex1

Key-Value 쌍 삭제하기

  이번에는 딕셔너리형에 이미 존재하는 키벨류쌍(Key-Value pairs)을 삭제하려고 한다.

kv_pairs_ex1
# {'name' : '홍길동', 'age' : 27}

del kv_pairs_ex1['name']
# 'name'이라는 Key를 갖는 Key-Value Pairs를 삭제하는 코드

kv_pairs_ex1

 

Key에 관하여

  이때 유의해야할 점이 있는데, value 값은 중복될 수 있지만, key 값은 중복될 수 없다는 점이다. 만약 key 값이 중복된다면, 하나의 key를 통해서 어떤 값을 불러와야할지 명확하지 않기 때문에 문법으로 강제함으로써 애초에 그런 상황을 만들지 않는 것이다. 사전에서도 하나의 단어에 대한 설명이 이곳저곳에 흩어져 있지 않듯이, 딕셔너리형에서도 동일한 Key로 여러개의 Key-Value쌍이 존재하지 않는다. 대신 Value는 중복을 허용한다. 위에서 사용한 코드에서도 왼쪽 눈의 시력과 오른쪽 눈의 시력이 1.3으로 동일하지만 에러없이 잘 실행된다.

error = {'name' = "조보아", "name" = "화사"}
# 'name'이라는 key 값이 2개 있어서 에러가 난다.

good = {'name1' = "조보아", "name2" = "조보아"}
# key가 겹치지 않으므로 에러가 나지 않는다.

 

  Key의 위치에 꼭 문자형이 오지 않아도 된다.

dic_exam1 = {1 : "ITisIK"}

  딕셔너리형을 다루다 보면 Key값들만 모아서 다루어야 하는 경우가 있다. 이럴때 Key값들만을 모아서 리스트를 만들어주는 함수가 keys() 함수이다. 글 초반에 만들었던 my_info 변수에 keys() 함수를 적용시키면 아래와 같이 my_info의 Key에 해당하는 값들이 dict_keys 형태로 반환된다.

  만약 dict_keys 자료형이 아니라 리스트 형으로 사용하고 싶다면, 아래와 같이 list로 변환하면 된다.

list(my_info.keys())

 

Value에 관하여

  Value에는 모든 자료형이 올 수 있다.

dic_exam2 = {1 : 1}
dic_exam3 = {1 : "ITisIK"}
dic_exam4 = {1 : ["list1", "list2"]}
dic_exam5 = {1 : ("tuple",)}
dic_exam6 = {1 : {name : "ITisIK", age = 27}}


# 아래부터는 아직 공부하지 않은 자료형을 Value로 넣은 코드이다.

dic_exam7 = {1 : set("itisik")}
# 집합(Set)자료형

dic_exam8 = {1 : True}
# 논리값(참·거짓;Bool)자료형

 

  Value도 Key와 마찬가지로 그 값들만 모아서 살펴봐야 하는 경우가 있을 수 있는데 이 때 사용하는 함수가 values() 함수이다. 사용법은 keys() 와 동일하다.

my_info.values()

  그러나 dict_values 자료형은 list() 함수를 이용해서 리스트 형태로 변환하는 것이 불가능하기 때문에 다른 방법을 이용해야하는데 이 방법은 아직 배우지 않은 문법이 다수 들어가기 때문에 추후에 다루도록 하겠다.

 

딕셔너리형에 관련된 몇 가지 함수

  특정 Key가 딕셔너리형 안에 있는지 여부(True / False)를 반환해주는 키워드 in

dic_exam9 = {"start" : 1, "end" : 999}
'middle' in dic_exam9
# False

'end' in dic_exam9
# True

 

Key-Value 쌍을 한 번에 모두 얻어주는 items() 함수

dic_exam9.items()

 

Key-Value 쌍을 모두 지워주는 clear() 함수

dic_exam9.clear()
dic_exam9

 

  여기까지 데이터 분석에서 그리고 다양한 프로그래밍 분야에서 심심치 않게 사용되고 있는 딕셔너리 자료형에 대해서 알아보았다. 다른 프로그래밍 언어에서 딕셔너리 자료형이라는 이름이 아니더라도, Key-Value가 한 쌍(Pairs)을 이루고 있는 형태로 존재하는 경우가 많으므로, 한 번 공부할 때 제대로 공부해두면 이후의 공부에 큰 도움이 될 것이라고 생각한다.

 

 

  다음 포스트에서는 수학에서 배우는 집합과 동일한 개념을 갖는 집합자료형에 대해서 알아보려고 한다.

반응형