파이썬 딕셔너리 | 파이썬 독학 4-3

파이썬 딕셔너리

파이썬 딕셔너리(dictionary) 자료형은 리스트나 문자열하고는 큰 차이가 있습니다. 이전학습에서 봤던 리스트, 문자열은 시퀀스(Sequence)라고 했습니다.

딕셔너리는 시퀀스가 아니라 매핑(mapping) 입니다. 무슨 말이냐면 시퀀스에서는 인덱스로 값을 추출했던 것을 매핑에서는 키(key)로 값을 추출합니다.

자료구조의 해쉬테이블과 닮았습니다. 키(Key)와 값(Value)을 매핑(mapping) 하는 것 입니다.

말로 설명하면 어렵지만 예제를 통해 보면 이해가 빠릅니다.

파이썬 딕셔너리

파이썬 딕셔너리 만들기

주요내용

1. 파이썬 딕셔너리에 대하여 이해합니다. (매핑 mapping)

2. 딕셔너리를 만들고 키로 값을 추출할 수 있습니다.

매핑 연산의 예제입니다.

myDict = {'driver': 'Jake', 'age': 37}
 
print(myDict)
print(myDict['driver'])
print(myDict['age'])
{'driver': 'Jake', 'age': 37}
Jake
37

매핑데이터를 저장할 때 가운데 : 콜론을 사용했습니다. 또 중괄호 { } 를 사용합니다. 리스트의 대괄호 [ ] 와 문자열의 ” ” 과 차이가 있습니다. 이런 기호들을 유심히 보고 구분하는게 필요합니다.

‘driver’ : ‘Jake’ 에서는 앞의 driver 가 키가 되고 Jake가 값이 됩니다. 딕셔너리의 요소는 순서가 없습니다. 이것이 시퀀스 처럼 인덱스를 넣고 사용할 수 없는 이유입니다.

myDict[0] 이와 같이 인덱스를 사용하는게 아니라 myDict[‘age’] 처럼 키를 사용합니다.

myDict = {'driver': 'Jake', 'age': 37}
 
myDict['driver'] = 'John'
myDict['height'] = 182
myDict[111] = 50
 
print(myDict)
print('driver:', myDict['driver'])
print('age:', myDict['age'])
{'driver': 'John', 'age': 37, 'height': 182, 111: 50}
driver: John
age: 37

딕셔너리에는 새로운 키를 생성하고 값을 할당할 수 있습니다. 리스트는 메소드를 사용했지만 딕셔너리는 그냥 할당을 하면 되므로 편합니다. myDict[키] = 값

또한 키값으로 숫자도 사용할 수 있습니다. myDict[1] 라고 쓰면 인덱스와 비슷하지만 키입니다.

여기에 리스트와의 미묘한 차이가 있습니다. 리스트는 index range 를 벗어날 수 없지만 딕셔너리는 range 제한이 없습니다. 즉 myDict[10] 을 하건 myDict[999]하건 새로운 키가 추가됩니다.

리스트와 비교부터 하니 약간 혼란스러울 수 있습니다.

파이썬 딕녀너리 키 (Key)

딕셔너리의 키(key)는 유일한 값을 같지만 값(value)은 그렇지 않습니다. 딕셔너리의 우리말은 사전이죠? 한글사전, 영어사전을 생각하면 됩니다.

네이버사전에서 어떤 단어의 뜻을 찾을 때 검색어(keyword)를 입력합니다. 검색어를 키워드라고 하니까 연결이 자연스럽습니다. 네이버사전에서 key 가 되는 단어를 입력하면 이에 대응(mapping)하는 value 를 찾아줍니다.

단어의 뜻은 같지만 부르는 이름이 다른 경우는 있습니다. 예를 들어 아버지를 아빠라고 하기도 하죠. 아빠, 아버지의 뜻 ‘직계인 남성 부모’ 은 똑같이 써놔도 됩니다. 즉 사전의 값(value)은 중복이 가능합니다. 하지만 ‘아빠’나 ‘아버지’라는 단어는 유일합니다.

이것이 의미하는 것은 ‘직계인 남성 부모’ 로 검색하면 ‘아빠’ ‘아버지’ 두 개의 값이 나온다는 뜻입니다. 검색엔진에서는 결과값을 가져오겠지만 파이썬 프로그래밍에서는 안됩니다.

애초에 키는 하나입니다. 예제를 보면

myDict = {1: 'cat', 2: 'dog', 1:'bird'}
print(myDict)
{1: 'bird', 2: 'dog'}

딕셔너리에 키 1을 2개 넣으려 했지만 들어가지 않습니다. 컴파일 오류는 출력되지 않지만 이런 방식은 좋지 않습니다.

myDict = {1: 'cat', 2: 'cat'}
print(myDict)
{1: 'cat', 2: 'cat'}

위 코드에서는 ‘cat’ 이란 같은 value가 두개 들어가 있습니다. 키는 중복이 안되지만 값은 중복이 상관없다는 것 입니다.

DBMS를 배운 사람들은 데이터베이스에서 테이블을 생성할 때 프라이머리키(primary key)가 반드시 있어야 한다는 조건이 있죠? 레코드를 검색하고 추출하기 위해서 다른 것들과 구분되는 기준이 있어야 합니다. 즉 유니크(unique)함이 필요합니다. 딕셔너리의 키도 유일한 값입니다.

파이썬 딕셔너리 중첩 – nested dictionary

딕셔너리도 리스트와 마찬가지로 중첩을 허용합니다.

자유롭게 중첩이 가능하다는 부분은 사용의 유연성을 더하는데 이는 프로그래머가 저수준의 자료구조를 만드는데 시간을 쏟지 않아도 된다는 뜻이기도 합니다.

myDict = {'myFavorite':['apple', 'orange', 'strawberry'],
          'color': ['red', 'blue','green'],
          'manager': {'name':'sara', 'age':37}
          }
 
print(myDict['myFavorite'])
print(myDict['color'][0])
print(myDict['manager']['name'])
['apple', 'orange', 'strawberry']
red
sara

딕셔너리 안에 리스트나 딕셔너리를 중첩할 수 있습니다.

딕셔너리에 리스트를 넣느냐 딕셔너리를 넣느냐 등 여러가지 경우의 수를 생각해볼 수 있습니다.

어떤 방법으로 데이터 구조를 만들지에 대해서는 프로그래머가 결정할 일입니다.

하나의 같은 결과를 얻는데 사용되는 방법은 다를 수 있습니다. 좋은 프로그래머는 처음에는 다른 사람의 코드를 보고 배우는 것에서 시작하지만 결국은 자신만의 노하우를 터득할 것 입니다.

이런 문제입니다. 구현하는 결과가 같아도 거기까지 가는 과정은 여러가지가 있습니다.

사실 모르는 사람들이 봤을 때 프로그래밍이 머리로 모든 것을 해결하는 것처럼 보이지만 많은 경우 try and error 시행착오를 통해서 완성됩니다.

아래 Programming Humor의 유명짤은 이 과정을 잘 보여줍니다.

it works why meme

이는 본인의 논리로 구현하지 않고 그냥 타인의 코드(오픈소스)를 가져다 사용할 때 많이 경험하는 일 입니다.

그러므로 평소에 연습을 통해 프로그래밍 논리와 기술을 익히는 일이 중요합니다.프로그래밍의 논리는 컴퓨터구조와 원리에 기반합니다. 이것이 베테랑 프로그래머들이 항상 컴퓨터를 더 공부하라고 충고하는 이유입니다.

여기서 컴퓨터구조에 대한 내용까지 커버하지는 않겠습니다만, 온라인 검색을 통해 관련 자료들을 읽고 자신만의 자료로 정리해두면 도움이 됩니다.

요약

이 포스팅에서는 핵심자료형인 파이썬 딕셔너리의 기본에 대하여 알아봤습니다.

파이썬은 현재 가장 빠르게 시작할 수 있으면서 결과물도 빠르게 나오는 언어입니다.

그런데 의욕을 가지고 파이썬을 시작했다가 딕셔너리 챕터 쯤에서 흥미를 잃고 그만두는 경우가 있습니다. 리스트와 딕셔너리 부터는 어느정도 프로그래머의 사고력이 필요한 부분이기 때문입니다.

하지만 어려워할 것은 없습니다. 프로그래밍은 데이터와 이를 조작하는 명령어로 이루어져 있습니다. 딕셔너리까지 마쳤다면 핵심적인 데이터타입은 거의 다 커버한 것 입니다.

어떤 강사님은 자료형만 다 이해해도 파이썬의 40%는 배운 것이라고도 말합니다.

프로그래밍은 악기연주와 비슷하다는 말을 종종합니다. 드롭박스의 창업자 드류 휴스턴의 어록으로 프로그래밍 튜토리얼에서 종종 이야기합니다.

피아노를 처음 배우는 사람이 연주를 잘 할 수 없습니다.

여기 매일 30분씩 건반과 악보를 더듬거리며 연습을 하는 사람이 있습니다.

사람들이 연주 솜씨를 들어보니 영 어설픈게 들을만 하지 않습니다.

그런데 사람들이 6개월이 지나서 다시 그의 연주를 들었을 때 뭔가 완벽하지는 않지만 그래도 들을만한 음색이 나옵니다.

시간이 지나서 그는 다양한 곡을 섭렵하게 됩니다. 처음 시작할 때는 한곡을 실수없이 치기위해 한달이 걸렸는데, 이제는 새로운 곡의 악보를 보고 한두번 정도 연습을 하면 충분히 멋지게 소화할 수 있게되었습니다.

이제 사람들은 누구도 그의 연주 실력을 의심하지 않죠. 아마추어가 저 정도면 훌륭하다고 했습니다.

그는 매일 30분씩하는 피아노 연습을 멈추지 않았습니다. 이전보다 피아노 연습이 더 재미있어 졌으니까요.

몇년이 지나자 그는 음악을 듣기만 해도 피아노로 같은 곡을 연주할 수 있게 되었고 더 나아가 자신만의 곡을 작곡하기에 이릅니다.

주변에 한명쯤 있을 법한 사람입니다.

이것을 피아노 연주가 아니라 프로그래밍으로 대입을 해보면 흥미롭습니다. 음악과 코딩은 전혀 공통점이 없는 분야인데 얼추 대략적으로 맞는 것 같습니다.

프로그래밍 공부를 맘먹고 하는데 실력이 늘지 않아서 고민인 분들에게 들려주고 싶은 이야기입니다.

외부참조링크

파이썬 코딩 1-6 | 파이썬의 자료형 | 파이썬 딕셔너리

Built-in Types Dictionary — Python 3.9.1 documentation

Leave a Comment