본문 바로가기

자료구조

[Python/파이썬] 딕셔너리 자료형

이번 글에서는 파이썬에서 쉽게 사용가능한 딕셔너리 자료형에 대해 배워보겠습니다! 

1. 딕셔너리(Dictionary) 자료형

데이터를 다루다 보면  "이름" = "모코코", "직업" = "학생" 같은 관계형 데이터를 마주할 때가 있습니다. 이런 데이터들은 여러 개의 리스트나 다차원 리스트로 관리할 수 있으나, 데이터가 늘어남에 따라 관리가 어려워지고, 데이터를 추가 및 수정하는데 시간이 오래 걸리게 됩니다. 

# 관계형 데이터를 각각 리스트로 저장할 수도 있고
nameList = ['모코코','머코코','무코코']
levelList = ['초보','중급','고급']
color = ['green','yellow','rainbow']

# 다차원 리스트로 한번에 관리할 수도 있다
multiList = [['모코코','머코코','무코코'],  ['초보','중급','고급'],['green','yellow','rainbow']]

# 하지만 리스트가 커질수록 관리가 힘들고 수정 및 삭제하는데 시간이 오래 걸린다...

이럴 때에 사용할 수 있는 방법이 바로 딕셔너리입니다. 파이썬 내의  딕셔너리는 기본적으로 해쉬 구조로 되어있어 많은 데이터를 다루는데 배열보다 적합합니다. 해쉬 구조에 대해서는 추후에 업로드하도록 하겠습니다!

1.1. 딕셔너리 타입 생성

먼저 딕셔너리를 생성하는 방법에 대해 알아보겠습니다. 딕셔너리 타입을 생성할 때에는 '{ }' 괄호를 사용하여 직접 생성할 수도 있고, dict() 함수를 사용해서 생성할 수도 있습니다. '{ }'괄호를 사용하는 경우 key값에 대한 제한이 없으나, dict()함수를 사용하는 경우 key값에는 일반 변수를 사용해야 됩니다.

# 괄호를 사용해서 딕셔너리를 생성
myDict = {'모코코':['lv1','green'],'머코코':['lv2','yellow'],'무코코':['lv3','rainbow ']}

# dict()함수를 사용하여 딕셔너리를 생성
myDict_2 = dict(모코코 = ['lv1','green'], 머코코=['lv2','yellow'], 무코코=['lv3','rainbow'])

# Error
errorDict = dict(1='a','2'='b') # SyntaxError <- 1과 '2' 모두 syntaxError

위의 코드의 경우, '모코코', '머코코' 와 '무코코'를 딕셔너리의 키(key)라 부르고, 콜론(:) 옆에 있는 리스트 형 데이터를 딕셔너리의 값(value)라고 부릅니다. 

1.2. 딕셔너리의 key 와 value

딕셔너리의 키에는 문자열, 숫자 혹은 튜플 타입을 사용할 수 있습니다. 만약 리스트나 딕셔너리와 같은 데이터 수정이 가능한 타입이 키 값으로 사용되면 TypeError를 볼 수 있습니다. 또한, 딕셔너리 내에서 키 값이 중복될 경우 중복되었던 앞의 키와 값이 사라지니 주의해야합니다. 

# 키 값에는 숫자, 문자열, 튜플 사용 가능!
myDict = {1:'A','BCD':2, ('E','F'):3}

# 키 값이 중복된다면!
tmpDict = {1:'LEFT',2:'MIDDLE',1:'RIGHT'}
print(tmpDict) # {1:'RIGHT', 2:'MIDDLE'} <- 중복된 키 값의 가장 마지막 값만 살아남음

# 만약 리스트나 딕셔너리 타입을 키 값으로 사용한다면 TypeError
errorDict = {[1,2]:1, {3:'3',4:'4'}:2} -> TypeError

딕셔너리의 키 값은 key()를 사용하여 키 데이터를 얻어 볼 수 있으며, dict_keys 타입으로 반환하기 때문에 앞에 list나 tuple을 사용하여 상황에 맞게 형변환 해서 사용할 수 있습니다. 

myDict = {1:'A','BCD':2, ('E','F'):3}

# key()를 사용하여 딕셔너리의 키 값 얻기
a = myDict.keys()
a_list = list(a) 

print(a) # dict_keys([1, 'BCD', ('E', 'F')])
print(a_list) # [1, 'BCD', ('E', 'F')]

딕셔너리의 값(value)의 경우 문자열, 숫자, 리스트, 튜플, 딕셔너리 등 다양한 값이 들어올 수 있습니다. 또한, 하나의 키 안에 여러 개의 데이터를 추가해야 하는 경우 리스트나 튜플, 혹은 딕셔너리 타입을 사용하여 추가할 수 있습니다. 단, 하나의 키에 2개 이상의 값을 넣게 되면 SyntaxError가 발생되니 주의해야합니다.

# value 값에는 숫자, 문자열, 튜플, 리스트, 딕셔너리 사용 가능!
myDict = {'A':1,'B':'2', 'C':[3], 'D':(4,5), 'E':{6:'6',7:'7'}}

# value 값은 중복 가능!
tmpDict = {1:'LEFT',2:'MIDDLE',3:'LEFT'}
print(tmpDict) # {1:'LEFT',2:'MIDDLE',3:'LEFT'}

# 만약 한개의 키에 2개의 value를 넣는 경우 SyntaxError
errorDict = {1:'1','2'} -> SyntaxError

딕셔너리의 값(value) 또한  value()를 사용하여 값 데이터를 얻어 볼 수 있으며, dict_values 타입으로 반환하기 때문에 앞에 list나 tuple을 사용하여 상황에 맞게 형변환 해서 사용할 수 있습니다. 

myDict = {1:'A','BCD':2, ('E','F'):3}

# value()를 사용하여 딕셔너리의 키 값 얻기
a = myDict.values()
a_list = list(a)

print(a) # dict_values(['A', 2, 3])
print(a_list) # ['A', 2, 3]

마지막으로 items()를 사용하여 딕셔너리에 존재하는 모든 키와 값을 튜플로 묶어서 볼 수 있습니다. 또한, for-loop와 items()를 함께 사용하여 딕셔너리의 key와 value 값을 각각 얻어낼 수 있습니다. 

myDict = {1:'A','BCD':2, ('E','F'):3}

# items()를 사용하여 딕셔너리의 모든 값 얻기
a = myDict.items() 
print(a) # dict_items([(1, 'A'), ('BCD', 2), (('E', 'F'), 3)])

# for loop를 사용하여 딕셔너리의 키와 값 얻기
for key, val in myDict.items():
	print('key = ',key, ' value = ',val)
# key =  1  value =  A
# key =  BCD  value =  2
# key =  ('E', 'F')  value =  3

1.3. 딕셔너리의 값 추가&변경&삭제

위에서 딕셔너리를 생성 했다면, 이번에는 딕셔너리를 추가, 변경 및 삭제해 보겠습니다. 먼저 위와 같은 myDict라는 딕셔너리 타입의 데이터가 있을 때, myDict[key값]을 사용하여 특정 key 값에 대한 value 값을 얻을 수 있으며, 만약 딕셔너리 안에 key 값이 존재하지 않는다면, KeyError를 볼 수 있습니다. 

myDict = {1:'A','BCD':2, ('E','F'):3}

# 특정 key의 value 값 얻기
a = myDict[1]
b = myDict['BCD']
c = myDict[('E','F')]
print(a) # 'A'
print(b) # 2
print(c) # 3

# 만약 존재하지 않는 key 값을 넣는다면?
err = myDict[2] # KeyError

이제 위의 방법을 사용하여 딕셔너러를 추가 및 변경해 보겠습니다.  myDict [key값] = value값을 사용할 때, key값이 이미 존재할 경우에는 value 값으로 데이터 수정, 존재하지 않을 경우 딕셔너리에 key와 value값으로 추가되게 됩니다.  

myDict = {1:'A','BCD':2, ('E','F'):3}

# 딕셔너리 수정 및 추가
myDict[1] = 'AB' # 이미 1이라는 key 값이 있기에 데이터 수정
myDict['4'] = 4 # '4'라는 key값은 없기에 데이터 추가

print(myDict) # {1:'AB,'BCD':2, ('E','F'):3, '4':4}

딕셔너리를 변경하는 방법에는 update()를 사용하는 방법 또한 있습니다. 이 방법의 경우 2개의 딕셔너리를 합치는 개념인데, 위와 마찬가지로 key 값이 겹칠 경우, 괄호 안에 있는 딕셔너리의 key와 value 데이터로 바뀌게 됩니다.  

myDict = {1:'A','BCD':2, ('E','F'):3}
newDict = {1:'AA',4:'4'}

# update를 사용하여 두개의 딕셔너리 합치기
a = myDict.update(newDict)
print(myDict) # {1: 'AA', 'BCD': 2, ('E', 'F'): 3, 4: '4'}
print(a) # None

딕셔너리 내의 데이터를 삭제하기 위해서 크게 2가지 방법이 있습니다. 첫 번째는. popitem()를 사용하여 딕셔너리 내의 가장 마지막 key와 value 데이터를 추출 후 삭제하는 것이고, 두 번째는 del 키워드와 myDict[key값]을 사용하여 딕셔너리 내 특정 key값과 value값을 지우는 방법입니다.  

myDict = {1:'A','BCD':2, ('E','F'):3}

# popitem()을 사용하여 가장 마지막 key와 value를 지움
a = myDict.popitem()
print(a) # (('E','F'):3)
print(myDict) # {1:'A','BCD':2}

# del 키워드를 사용하여 특정 key와 value를 지움
del myDict[1] 
print(myDict) # {'BCD':2}

만약 딕셔너리 내의 모든 데이터를 삭제하고 빈 딕셔너리로 초기화하고 싶다면 clear() 함수를 사용할 수 있습니다. 

myDict = {1:'A','BCD':2, ('E','F'):3}

# clear() 함수를 사용하여 빈 딕셔너리로 초기화
myDict.clear()
print(myDict) # { }

1.4. 딕셔너리 내 key값 존재 여부 확인하기

마지막으로 in, not in을 사용하여 딕셔너리 내 key 값의 존재 여부를 확인해 보겠습니다. in와 not in의 경우 앞 글의 배열에서 사용했던 것과 매우 비슷합니다. 

myDict = {1:'A','BCD':2, ('E','F'):3}

# in 사용하여 key값 존재 여부 확인하기
print(1 in myDict) # True
print(2 in myDict) # False

# not in 사용하여 key값 존재 여부 확인하기
print('BCD' not in myDict) # False
print(('G','H') not in myDict) # True

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

2. 집합(Set) 자료형