파이썬 독학/입문 강의

[파이썬독학강의] 8.1 파이썬 딕셔너리(Dictionary) 자료형

데니 by danny 2023. 2. 25. 13:05
반응형

파이썬 딕셔너리(Dictionary)
파이썬 딕셔너리(Dictionary)

님들 안녕하세요. 14년 차 IT개발자 데니예요. 오늘은 파이썬 딕셔너리(Dictionary)에 대한 개념과 사용법에 대해서 알아보는 시간을 가져볼게요. 제가 파이썬 독학 강의를 만들기 위해 다양한 파이썬 입문 관련 책과 강의를 보았는데, 거기서 학습자를 이해시키기 위해 파이썬 딕셔너리를 설명하는 방법은 모두 동일했어요. 그 내용을 말씀드리면, "딕셔너리(Dictionary)는 우리말로 사전이라는 뜻을 가지며, 'apple'이라는 영단어에 '사과'라는 한글 뜻이 부합되듯이 딕셔너리는 key와 value를 한 쌍으로 갖는 자료형이다. 그러므로 영단어 'apple'은 딕셔너리의 key가 되고 한글 뜻 '사과'는 딕셔너리의 value가 되어 'apple':'사과' 라는 key:value쌍을 갖게 된다. "라고 설명하고 있어요.  이러한 일반적인 설명을 제 블로그 강의 본론에 담지 않고 여기서 말씀드리는 이유는  일반적인 설명은 다른 강의나 책에서도 참고하실 수 있으니, 조금 다른 설명 방법이지만 앞으로 딕셔너리를 사용하시는 데 있어 조금 더 실용적으로 사용하실 수 있도록 설명드리고 싶어서예요. 강의 본문 내용이 여타의 책과 강의처럼 일반적인 설명이 아니어서 받아들이기 힘드실까 봐 먼저 딕셔너리의 일반적인 개념 설명을 하고 시작하는 거니, 본문 강의 잘 따라와 주시면 감사하겠어요.

 

 

8.1 파이썬 딕셔너리(Dictionary)

  ▶ 딕셔너리(Dictionary)란?

딕셔너리 데이터를 표 형식으로 나타낼 수 있는 자료형이예요.  아래 표를 보시면 딕셔너리에서 사용하는 용어인 Key는 컬럼명이 되고, Value는 컬럼명에 해당하는 값이 되어 표로 나타낼 수 있어요.

 

딕셔너리 이해 자료1
딕셔너리 이해 자료1

 

위의 표를 딕셔너리 Key:Value쌍 관계로 표현하면 아래 그림처럼 표현할 수 있어요. 딕셔너리의 Key:Value쌍은 표의 컬럼명:컬럼명에 해당하는 값과 동일한 의미라는 것을 알 수 있어요. 또한, 딕셔너리는 Key와 Value가 연결되어 있기 때문에 오직 Key를 통해서만 Value에 접근할 수 있어요.

 

딕셔너리 Key:Value쌍 표현1

 

자! 그럼...아래 표처럼 컬럼명에 해당하는 값이 여러 개인 경우(Key 1개에 Value N개의 관계를 가지는 경우), 딕셔너리는 어떻게 Key:Value쌍 관계를 가지게 될까요? 

 

딕셔너리 이해 자료2
딕셔너리 이해 자료2

 

답은 여러 개의 값을 요소로 가지는 리스트(List)를 생성해서 Value로 사용할 수 있어요. 아래 그림을 보시면 쉽게 이해되실 거예요.

 

딕셔너리 Key:Value쌍 표현2
딕셔너리 Key:Value쌍 표현2

 

딕셔너리는 이러한 Key와 Value의 쌍 여러 개가 중괄호 {}로 둘러 싸여 있는 자료형이에요.

딕셔너리 생성 방법은 딕셔너리명 = {key1:value1, key2:value2, key3:value3, ...}  로 표현해서 생성해요. 딕셔너리(Dictionary)의 특징으로는 리스트(List)나 튜플(Tuple)처럼 순차적이지 않아요. 리스트나 튜플은 생성 시에 자동으로 순번(index)이 생성되지만, 딕셔너리는 순차적이지 않으므로 순번(index)이 생성되지 않기 때문에 순번(index)을 갖고 있지 않아요. 그러므로 인덱싱(Indexing)과 슬라이싱(Slicing)이 불가능해요. 순번(index)이 없으므로 Key를 통해서만 Value에 접근해야 해요. 딕셔너리의 Key는 고유 값이므로 변경 불가능해요. Value는 언제든지 변경가능하고, 중복 값도 사용가능해요.

 

 

  ▶ 딕셔너리 생성

딕셔너리 생성 방법은 아래 그림처럼 중괄호를 사용해서 Key:Value쌍 요소들을 묶고 변수(딕셔너리명)에 대입하면 돼요. 리스트와 튜플을 생성하는 방법과 유사해요. 단, 중괄호 {}를 사용하고, Key:Value쌍을 요소로 사용한다는 점이 달라요.

딕셔너리 생성 방법
딕셔너리 생성 방법

 

딕셔너리의 Key 값에 숫자, 문자, 문자열을 모두 사용할 수 있어요. 실습을 통해서 살펴볼게요.

1
2
3
4
5
6
7
8
9
>>> dict2 = {1:'ab'}
>>> dict2
{1:'ab'}
>>> dict3 = {'a':1}
>>> dict3
{'a':1}
>>> dict4 = {'ab':1}
>>> dict4
{'ab':1}
cs

라인[1]~[3]는 key가 숫자 1이고, value가 문자열 'ab'인 딕셔너리를 생성해서 dict2변수에 대입하고 출력했어요.

라인[4]~[6]는 key가 문자 'a'이고, value가 숫자 1인 딕셔너리를 생성해서 dict3변수에 대입하고 출력했어요.

라인[7]~[9]는 key가 문자열 'ab'이고, value가 숫자 1인 딕셔너리를 생성해서 dict4변수에 대입하고 출력했어요.

 

딕셔너리 key 값에 튜플을 사용할 수 있어요. 단, 리스트는 사용할 수 없어요. key로 튜플은 되고, 리스트는 왜 안될까요? 그 이유는 튜플은 요소 값을 수정할 수 없지만, 리스트는 수정 가능하기 때문이에요. 딕셔너리의 key는 고유 값이므로 key값이 변경된다면 key:value쌍이 파괴되어 더 이상 value값을 찾을 수 없게 될 거예요. 그러므로 생성되면 수정 불가능한 튜플만 key로 사용 가능해요.

 

1
2
3
4
5
6
7
8
>>> dict5 = {(1,2):'ab'}
>>> dict5
{(1,2):'ab'}
>>> dict6 = {[1,2]:'ab'}
Traceback (most recent call last):
  File "<stdin>", line 1in <module>
TypeError: unhashable type: 'list'
>>>
cs

라인[1]~[3]은 key가 튜플 (1,2)이고, value가 문자열 'ab'인 딕셔너리를 생성해서 dict5변수에 대입하고 출력했어요.

라인[4]는 key가 리스트 [1,2]이고, value가 문자열 'ab'인 딕셔너리를 생성하려 했어요.

라인[5]~[7]은 unhashble type:list 오류가 발생했어요. list는 딕셔너리로 사용불가능하므로 해당 오류를 발생시켜요.

참고로 오류 내용 중에 unhashble type이라는 것은 딕셔너리를 생성할 때 hash 함수를 통해서 key와 value의 관계를 맵핑시켜 주는데, 그 맵핑 과정 중에 key 값이 hashable한 고유 값이어야 하는데, 리스트는 고유 값이 아닌 변경 가능한 unhashble한 값이므로 딕셔너리 key값으로 사용할 수 없다는 뜻이에요.

 

딕셔너리를 생성할 때 주의하셔야 할 사항이 한 가지 더 있어요. 딕셔너리는 key중복을 허용하지 않아요. 만약 딕셔너리 생성 시 중복된 key가 있다면 최종 key:value쌍만 남기고 모두 무시된 상태로 딕셔너리 생성이 될 거예요. 실습을 통해 살펴볼게요.

 

1
2
3
4
>>> dict7 = {1:'a'1:'b'}
>>> dict7
{1:'b'}
>>
cs

라인[1]은 key가 숫자 1로 중복 사용되어 딕셔너리를 생성했어요. 정상적으로 딕셔너리가 생성된 것처럼 보이지만 결과를 출력해 보면 그렇지 않다는 것을 아실 수 있어요.

라인[2]~[3]은  dict7를 출력해 보았어요. 결과는 {1:'a', 1:'b'}이 아닌 중복 키 값 중 최종 요소인 1:'b'만 남기고 중복 키를 사용한 key:value쌍은 무시되어 딕셔너리가 생성된 걸 확인하실 수 있어요.

 

딕셔너리에서 key를 사용해서 value에 접근하는 방법딕셔너리명[key] 표현방법을 사용하시면 돼요.

 

1
2
3
4
5
6
>>> dict8 = {1:'You need Python''ab':777}
>>> dict8[1]
'You need Python'
>>> dict8['ab']
777
>>>
cs

라인[1]~[3]은 딕셔너리를 생성하고, dict8[1]을 사용해서 key가 숫자 1로 맵핑된 value에 접근해서 'You need Python'을 출력했어요.

라인[4]~[5]은 dict8['ab']을 사용해서 key가 문자열 'ab'로 맵핑된 value에 접근해서 숫자 777을 출력했어요.

 

 

위의 4가지 실습을 통해서 우리가 알게 된 점을 살펴볼게요.

1. 딕셔너리 key 값으로 숫자, 문자, 문자열, 튜플을 사용할 수 있어요. 리스트는 사용할 수 없어요.

2. 딕셔너리 내 중복된 key 값이 있다면, 요소 내 최종 key:value만 남기고 나머지 중복 key가 사용된 key:vlaue쌍은 무시되어 생성돼요.

3. 딕셔너리명[key]를 사용해서 value에 접근할 수 있어요.

 

  ▶ 딕셔너리 요소 추가 및 삭제

딕셔너리는 요소 추가와 삭제가 가능해요. 요소를 추가할 때는 딕셔너리명[key] = value 표현 방법을 사용하시면 돼요. 요소를 삭제할 때는 del 딕셔너리명[key] 표현방법을 사용하시면 돼요. 실습을 통해 살펴볼게요.

 

아래는 요소 추가에 대한 실습이에요.

1
2
3
4
5
6
7
8
9
10
11
12
>>> dict9 = {1:'a'}
>>> dict9[2= 'b'
>>> dict9
{1:'a'2'b'}
>>> dict9['name'= 'Peny'
>>> dict9
{1:'a'2:'b''name':'Peny'}
>>> dict9[3= ['a''b''c']
>>> dict9
{1:'a'2:'b''name':'Peny'3:['a''b''c']}
>>>
 
cs

라인[1]은 key가 숫자 1이고 value가 문자 'a'인 1:'a'쌍을 요소로 갖는 딕셔너리를 생성해서 dict9 변수에 대입했어요.

라인[2]는 변수명[key] = value 표현방법을 사용해서 key가 숫자 2이고, value가 문자 'b'인 2:'b'쌍을 딕셔너리 요소로 추가했어요.

라인[3]~[4]은 dict9 출력 결과로 2:'b'쌍이 정상적으로 딕셔너리로 요소로 추가되었어요.

라인[5]는 key가 문자열 'name'이고 ,vlaue가 문자열 'Peny'인 'name':'Peny'쌍을 딕셔너리 요소로 추가했어요.

라인[6]~[7]은 dict9 출력 결과로 'name':'Peny'쌍이 정상적으로 딕셔너리 요소로 추가되었어요.

라인[8]은 key가 숫자 3이고, value가 리스트 ['a', 'b', 'c']인 3:['a', 'b', 'c']쌍을 딕셔너리 요소로 추가했어요.

라인[9]~[10]은 출력 결과로 3:['a', 'b', 'c']쌍이 정상적으로 딕셔너리 요소로 추가되었어요.

 

아래는 요소 삭제에 대한 실습이에요.

1
2
3
4
5
6
7
8
9
>>> dict9 = {1:'a'2:'b''name''Peny'3:['a''b''c']}
>>> del dict9[3]
>>> dict9
{1:'a'2:'b''name':'Peny'}
>>> del dict9['name']
>>> dict9
{1:'a'2:'b'}
>>>
 
cs

라인[1]은 숫자, 문자열을 key로 사용하고, 문자, 문자열, 리스트를 value로 사용한 딕셔너리를 생성해서 dict9 변수에 대입했어요.

라인[2]은 del 딕셔너리명[key] 표현 방법을 사용해서 딕셔너리 요소를 삭제했어요. 딕셔너리 요소인 3:['a', 'b', 'c']쌍을 삭제했어요.라인[3]~[4]는 dict9 출력 결과로 3:['a', 'b', 'c']쌍이 삭제되고 나머지 요소만 출력되었어요.라인[5]는 'name':'Peny'쌍을 삭제했어요.라인[6]~[7]은 dict9 출력 결과로  'name':'Peny'쌍이 삭제되어 dict9는 {1:'a', 2:'b'}만 요소로 가진 딕셔너리가 되었어요.

 

님들 오늘은 딕셔너리에 대한 개념과 요소 추가 및 삭제 방법을 학습해 봤어요. 그리고 딕셔너리와 리스트, 튜플에 대한 차이를 살펴보았어요. 가장 큰 차이점은 딕셔너리는 iterable하지 않고 순번(인덱스)가 없다는 것이에요. 그래서 key로 value에 접근해야 한다는 점이에요. 오늘도 너무 고생 많으셨어요. 다음 시간에는 딕셔너리 심화과정으로 딕셔너리 사용에 익숙해지는 실습을 진행할 거예요. 또한, 딕셔너리 관련 함수에 대해서도 알아보는 시간을 가져볼게요. 다음 포스팅에서 봬요!

반응형