점프 투 파이썬 00장 들어가기 전에 00-1 머리말 00-2 저자소개 00-3 동영상 강의 00-4 소스 코드 00-5 책 구입 안내 00-6 주요변경이력 01장 파이썬이란 무엇인가? 01-1 파이썬이란? 01-2 파이썬의 특징 01-3 파이썬으로 무엇을 할 수 있을까? 01-4 파이썬 설치하기 01-5 파이썬 둘러보기 01-6 파이썬과 에디터 02장 파이썬 프로그래밍의 기초, 자료형 02-1 숫자형 02-2 문자열 자료형 02-3 리스트 자료형 02-4 튜플 자료형 02-5 딕셔너리 자료형 02-6 집합 자료형 02-7 불 자료형 02-8 자료형의 값을 저장하는 공간, 변수 02장 되새김 문제 03장 프로그램의 구조를 쌓는다! 제어문 03-1 if문 03-2 while문 03-3 for문 03장 되새김 문제 04장 파이썬의 입출력 04-1 함수 04-2 사용자 입출력 04-3 파일 읽고 쓰기 04-4 프로그램의 입출력 04장 되새김 문제 05장 파이썬 날개 달기 05-1 클래스 05-2 모듈 05-3 패키지 05-4 예외 처리 05-5 내장 함수 05-6 표준 라이브러리 05-7 외부 라이브러리 05장 되새김 문제 06장 파이썬 프로그래밍, 어떻게 시작해야 할까? 06-1 내가 프로그램을 만들 수 있을까? 06-2 3과 5의 배수를 모두 더하기 06-3 게시판 페이징하기 06-4 간단한 메모장 만들기 06-5 탭 문자를 공백 문자 4개로 바꾸기 06-6 하위 디렉터리 검색하기 07장 파이썬 날아오르기 07-1 파이썬과 유니코드 07-2 클로저와 데코레이터 07-3 이터레이터와 제너레이터 07-4 파이썬 타입 어노테이션 08장 정규표현식 08-1 정규 표현식 살펴보기 08-2 정규 표현식 시작하기 08-3 강력한 정규 표현식의 세계로 09장 부록 09-1 파이썬 코딩 면허 시험 20제 09-2 챗GPT와 함께 파이썬 공부하기 10장 정답 및 풀이 마치며.
    Published with WikiDocs
    1. 점프 투 파이썬
    2. 02장 파이썬 프로그래밍의 기초, 자료형
    3. 02-5 딕셔너리 자료형
    1. 도서 증정 이벤트 !!
    2. 위키독스

    02-5 딕셔너리 자료형

    [동영상 강의] : 점프 투 파이썬 02-5 딕셔너리 자료형

    사람은 누구든지 "이름" = "홍길동", "생일" = "몇 월 며칠" 등과 같은 방식으로 그 사람이 가진 정보를 나타낼 수 있다. 파이썬은 영리하게도 이러한 대응 관계를 나타낼 수 있는 딕셔너리(dictionary) 자료형을 가지고 있다. 이번에는 이 자료형에 대해 알아보자.

    요즘 사용하는 대부분의 언어도 이러한 대응 관계를 나타내는 자료형을 가지고 있는데 이를 딕셔너리라고 하고, ‘연관 배열(associative array)’또는 ‘해시(hash)’라고도 한다.

    • 딕셔너리란?
    • 딕셔너리는 어떻게 만들까?
    • 딕셔너리 쌍 추가, 삭제하기
      • 딕셔너리 쌍 추가하기
      • 딕셔너리 요소 삭제하기
    • 딕셔너리를 사용하는 방법
      • 딕셔너리에서 Key를 사용해 Value 얻기
      • 딕셔너리 만들 때 주의할 사항
    • 딕셔너리 관련 함수
      • Key 리스트 만들기 - keys
      • Value 리스트 만들기 - values
      • Key, Value 쌍 얻기 - items
      • Key: Value 쌍 모두 지우기 - clear
      • Key로 Value 얻기 - get
      • 해당 Key가 딕셔너리 안에 있는지 조사하기 - in

    딕셔너리란?

    딕셔너리는 단어 그대로 ‘사전’이라는 뜻이다. 즉 "people"이라는 단어에 "사람", "baseball"이라는 단어에 "야구"라는 뜻이 부합되듯이 딕셔너리는 Key와 Value를 한 쌍으로 가지는 자료형이다. 예컨대 Key가 "baseball"이라면 Value는 "야구"가 될 것이다.

    딕셔너리는 리스트나 튜플처럼 순차적으로(sequential) 해당 요솟값을 구하지 않고 Key를 통해 Value를 얻는다. 이것이 바로 딕셔너리의 가장 큰 특징이다. baseball이라는 단어의 뜻을 찾기 위해 사전의 내용을 순차적으로 모두 검색하는 것이 아니라 baseball이라는 단어가 있는 곳만 펼쳐 보는 것이다.

    딕셔너리는 어떻게 만들까?

    다음은 딕셔너리의 기본 모습이다.

    {Key1: Value1, Key2: Value2, Key3: Value3, ...}
    

    Key와 Value의 쌍 여러 개가 {}로 둘러싸여 있다. 각각의 요소는 Key: Value 형태로 이루어져 있고 쉼표(,)로 구분되어 있다.

    다음 딕셔너리의 예를 살펴보자.

    >>> dic = {'name': 'pey', 'phone': '010-9999-1234', 'birth': '1118'}
    

    위에서 Key는 각각 'name', 'phone', 'birth', 각각의 Key에 해당하는 Value는 'pey', '010-9999-1234', '1118'이 된다.

    딕셔너리 dic의 정보

    key value
    name pey
    phone 010-9999-1234
    birth 1118

    다음은 Key로 정숫값 1, Value로 문자열 'hi'를 사용한 예이다.

    >>> a = {1: 'hi'}
    

    또한 다음 예처럼 Value에 리스트도 넣을 수 있다.

    >>> a = {'a': [1, 2, 3]}
    

    딕셔너리 쌍 추가, 삭제하기

    딕셔너리 쌍을 추가 또는 삭제하는 방법을 살펴보자. 먼저 딕셔너리에 쌍을 추가해 보자.

    딕셔너리 쌍 추가하기

    >>> a = {1: 'a'}
    >>> a[2] = 'b'
    >>> a
    {1: 'a', 2: 'b'}
    

    {1: 'a'} 딕셔너리에 a[2] = 'b'와 같이 입력하면 딕셔너리 a에 Key와 Value가 각각 2와 'b'인 {2: 'b'} 딕셔너리 쌍이 추가된다.

    >>> a['name'] = 'pey'
    >>> a
    {1: 'a', 2: 'b', 'name': 'pey'}
    

    딕셔너리 a에 {'name': 'pey'} 쌍이 추가되었다.

    >>> a[3] = [1, 2, 3]
    >>> a
    {1: 'a', 2: 'b', 'name': 'pey', 3: [1, 2, 3]}
    

    Key는 3, Value는 [1, 2, 3]을 가지는 한 쌍이 또 추가되었다.

    딕셔너리 요소 삭제하기

    >>> del a[1]
    >>> a
    {2: 'b', 'name': 'pey', 3: [1, 2, 3]}
    

    위 예제는 딕셔너리 요소를 지우는 방법을 보여 준다. del 함수를 사용해서 del a[key]를 입력하면 지정한 Key에 해당하는 {Key: Value} 쌍이 삭제된다.

    딕셔너리를 사용하는 방법

    ‘딕셔너리는 주로 어떤 것을 표현하는 데 사용할까?’라는 의문이 들 것이다. 예를 들어 4명의 사람이 있다고 가정하고 각자의 특기를 표현할 수 있는 좋은 방법에 대해서 생각해 보자. 리스트나 문자열로는 표현하기가 매우 까다로울 것이다. 하지만 파이썬의 딕셔너리를 사용하면 이 상황을 표현하기가 정말 쉽다.

    다음 예를 살펴보자.

    {"김연아": "피겨스케이팅", "류현진": "야구", "손흥민": "축구", "귀도": "파이썬"}
    

    사람 이름과 특기를 한 쌍으로 묶은 딕셔너리이다. 정말 간편하지 않은가?

    지금껏 우리는 딕셔너리를 만드는 방법만 살펴보았는데, 딕셔너리를 제대로 활용하기 위해 알아야 할 것이 더 있다. 지금부터 하나씩 알아보자.

    딕셔너리에서 Key를 사용해 Value 얻기

    >>> grade = {'pey': 10, 'julliet': 99}
    >>> grade['pey']
    10
    >>> grade['julliet']
    99
    

    리스트나 튜플, 문자열은 요솟값을 얻고자 할 때 인덱싱이나 슬라이싱 기법 중 하나를 사용했다. 하지만 딕셔너리는 단 1가지 방법뿐이다. 그것은 바로 Key를 사용해서 Value를 구하는 방법이다. 위 예에서 'pey'라는 Key의 Value를 얻기 위해 grade['pey']를 사용한 것처럼 어떤 Key의 Value를 얻기 위해서는 '딕셔너리_변수_이름[Key]'를 사용해야 한다.

    몇 가지 예를 더 살펴보자.

    >>> a = {1:'a', 2:'b'}
    >>> a[1]
    'a'
    >>> a[2]
    'b'
    

    먼저 a 변수에 {1: 'a', 2: 'b'} 딕셔너리를 대입하였다. 위 예에서 볼 수 있듯이 a[1]은 'a' 값을 리턴한다. 여기에서 a[1]이 의미하는 것은 리스트나 튜플의 a[1]과는 전혀 다르다. 딕셔너리 변수에서 [] 안의 숫자 1은 두 번째 요소를 나타내는 것이 아니라 Key에 해당하는 1을 나타낸다. 앞에서도 말했듯이 딕셔너리는 리스트나 튜플에 있는 인덱싱 방법을 적용할 수 없다. 따라서 a[1]은 딕셔너리 {1: 'a', 2: 'b'}에서 Key가 1인 것의 Value인 'a'를 리턴한다. a[2] 역시 마찬가지이다.

    이번에는 a라는 변수에 앞의 예에서 사용한 딕셔너리의 Key와 Value를 뒤집어 놓은 딕셔너리를 대입해 보자.

    >>> a = {'a': 1, 'b': 2}
    >>> a['a']
    1
    >>> a['b']
    2
    

    역시 a['a'], a['b']처럼 Key를 사용해서 Value를 얻을 수 있다. 정리하면, 딕셔너리 a는 a[Key]로 Key에 해당하는 Value를 얻는다.

    다음 예는 이전에 한 번 언급한 딕셔너리인데, Key를 사용해서 Value를 얻는 방법을 잘 보여 준다.

    >>> dic = {'name':'pey', 'phone':'010-9999-1234', 'birth': '1118'}
    >>> dic['name']
    'pey'
    >>> dic['phone']
    '010-9999-1234'
    >>> dic['birth']
    '1118'
    

    딕셔너리 만들 때 주의할 사항

    딕셔너리에서 Key는 고유한 값이므로 중복되는 Key 값을 설정해 놓으면 하나를 제외한 나머지 것들이 모두 무시된다는 점에 주의해야 한다. 다음 예에서 볼 수 있듯이 동일한 Key가 2개 존재할 경우, 1: 'a' 쌍이 무시된다.

    >>> a = {1:'a', 1:'b'}
    >>> a
    {1: 'b'}
    

    이렇게 Key가 중복되었을 때 1개를 제외한 나머지 Key: Value 값이 모두 무시되는 이유는 Key를 통해서 Value를 얻는 딕셔너리의 특징 때문이다. 즉, 딕셔너리에는 동일한 Key가 중복으로 존재할 수 없다.

    또 1가지 주의해야 할 점은 Key에 리스트는 쓸 수 없다는 것이다. 하지만 튜플은 Key로 쓸 수 있다. 딕셔너리의 Key로 쓸 수 있느냐, 없느냐는 Key가 변하는(mutable) 값인지, 변하지 않는(immutable) 값인지에 달려 있다. 리스트는 그 값이 변할 수 있기 때문에 Key로 쓸 수 없다. 다음 예처럼 리스트를 Key로 설정하면 리스트를 키 값으로 사용할 수 없다는 오류가 발생한다.

    >>> a = {[1,2] : 'hi'}
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    TypeError: unhashable type: 'list'
    

    단, Value에는 변하는 값이든, 변하지 않는 값이든 아무 값이나 넣을 수 있다.

    딕셔너리 관련 함수

    딕셔너리를 자유자재로 사용하기 위해 딕셔너리가 자체적으로 가지고 있는 관련 함수를 사용해 보자.

    Key 리스트 만들기 - keys

    >>> a = {'name': 'pey', 'phone': '010-9999-1234', 'birth': '1118'}
    >>> a.keys()
    dict_keys(['name', 'phone', 'birth'])
    

    a.keys()는 딕셔너리 a의 Key만을 모아 dict_keys 객체를 리턴한다.

    점프 투 파이썬 파이썬 3.0 이후 버전의 keys 함수, 어떻게 달라졌나?

    파이썬 2.7 버전까지는 a.keys() 함수를 호출하면 dict_keys가 아닌 리스트를 리턴한다. 리스트를 리턴하기 위해서는 메모리 낭비가 발생하는데, 파이썬 3.0 이후 버전에서는 이러한 메모리 낭비를 줄이기 위해 dict_keys 객체를 리턴하도록 변경되었다. 다음에 소개할 dict_values, dict_items 역시 파이썬 3.0 이후 버전에서 추가된 것들이다. 만약 3.0 이후 버전에서 리턴값으로 리스트가 필요한 경우에는 list(a.keys())를 사용하면 된다. dict_keys, dict_values, dict_items 객체는 리스트로 변환하지 않더라도 기본적인 반복 구문(예: for 문)에서 사용할 수 있다.

    dict_keys 객체는 다음과 같이 사용할 수 있다. 리스트를 사용하는 것과 별 차이는 없지만, 리스트 고유의 append, insert, pop, remove, sort 함수는 수행할 수 없다.

    >>> for k in a.keys():
    ...    print(k)
    ...
    name
    phone
    birth
    
    • print(k)를 입력할 때 들여쓰기를 하지 않으면 오류가 발생하므로 주의하자.
    • for 문 등 반복 구문에 대해서는 03장에서 자세히 살펴본다.

    dict_keys 객체를 리스트로 변환하려면 다음과 같이 하면 된다.

    >>> list(a.keys())
    ['name', 'phone', 'birth']
    

    Value 리스트 만들기 - values

    >>> a.values()
    dict_values(['pey', '010-9999-1234', '1118'])
    

    Key를 얻는 것과 마찬가지 방법으로 Value만 얻고 싶다면 values 함수를 사용하면 된다. values 함수를 호출하면 dict_values 객체를 리턴한다.

    Key, Value 쌍 얻기 - items

    >>> a.items()
    dict_items([('name', 'pey'), ('phone', '010-9999-1234'), ('birth', '1118')])
    

    items 함수는 Key와 Value의 쌍을 튜플로 묶은 값을 dict_items 객체로 리턴한다.

    Key: Value 쌍 모두 지우기 - clear

    >>> a.clear()
    >>> a
    {}
    

    clear 함수는 딕셔너리 안의 모든 요소를 삭제한다.

    빈 리스트를 [], 빈 튜플을 ()로 표현하는 것과 마찬가지로 빈 딕셔너리도 {}로 표현한다.

    Key로 Value 얻기 - get

    >>> a = {'name': 'pey', 'phone': '010-9999-1234', 'birth': '1118'}
    >>> a.get('name')
    'pey'
    >>> a.get('phone')
    '010-9999-1234'
    

    get(x) 함수는 x라는 Key에 대응되는 Value를 리턴한다. 앞에서 살펴보았듯이 a.get('name')은 a['name']을 사용했을 때와 동일한 결괏값을 리턴한다.

    다만, 다음 예제에서 볼 수 있듯이 a['nokey']처럼 딕셔너리에 존재하지 않는 키로 값을 가져오려고 할 경우, a['nokey'] 방식은 오류를 발생시키고 a.get('nokey') 방식은 None을 리턴한다는 차이가 있다. 어떤 것을 사용할 것인지는 여러분의 선택에 달려 있다.

    여기에서 None은 ‘거짓’이라는 뜻이라고만 알아 두자.

    >>> a = {'name':'pey', 'phone':'010-9999-1234', 'birth': '1118'}
    >>> print(a.get('nokey'))
    None
    >>> print(a['nokey’])
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    KeyError: 'nokey'
    

    딕셔너리 안에 찾으려는 Key가 없을 경우, 미리 정해 둔 디폴트 값을 대신 가져오게 하고 싶을 때는 get(x, '디폴트 값')을 사용하면 편리하다.

    >>> a.get('nokey', 'foo')
    'foo'
    

    딕셔너리 a에는 'nokey'에 해당하는 Key가 없다. 따라서 디폴트 값인 'foo'를 리턴한다.

    해당 Key가 딕셔너리 안에 있는지 조사하기 - in

    >>> a = {'name':'pey', 'phone':'010-9999-1234', 'birth': '1118'}
    >>> 'name' in a
    True
    >>> 'email' in a
    False
    

    'name' 문자열은 a 딕셔너리의 Key 중 하나이다. 따라서 'name' in a를 호출하면 참(True)을 리턴한다. 이와 반대로 'email'은 a 딕셔너리 안에 존재하지 않는 Key이므로 거짓(False)을 리턴한다.

    마지막 편집일시 : 2023년 11월 26일 12:17 오전
    댓글 42 피드백
    댓글 32개 더 보기...
    @도형님 get함수의 두번째 파라미터 값을 사용해야 합니다. 즉, a.get('C', 70)은 a 딕셔너리에 'C'라는 키값이 없으면 70을 리턴한다는 의미입니다. - 박응용, 2018년 6월 2일 6:58 오후
    반대로 원래 리스트에 있던 값을 딕셔너리 키와 밸류값으로 넣을수있나요? 예를들면 a = [1, 2, 3, 4 ] b = [ㄱ, ㄴ, ㄷ,ㄹ] 이 두개값중에서 a 는 딕셔너리의 키로 , b는 딕셔너리의 밸류로 만들 수도 있나요? - 지성, 2019년 11월 7일 11:39 오후
    감사합니다! 덕분에 정말 파이썬에 대해 잘 배우고 있습니다^^ 다만, 본문을 읽다가 사소한 오타를 발견하였는데, '딕셔너리를 사용하는 방법 -> 딕셔너리 만들 때 주의할 사항'의 4번째 문단에서 "따라서 딕셔너리의 Key 값으로 딕셔너리를 사용할 수 없음은 당연하다.' -> "따라서 딕셔너리의 Key 값으로 리스트를 사용할 수 없음은 당연하다.' 로 바뀌어야 될 것 같습니다!! 항상 감사합니다! - 윤종훈, 2021년 3월 23일 7:42 오후
    @윤종훈님 딕셔너리 또한 변하는 값이기 때문에 딕셔너리의 Key로 사용할 수 없다고 언급하는 부분입니다. 윗 부분이랑 같이 생각하면 헷갈릴수 있겠네요 ^^ - 박응용, 2021년 3월 23일 9:50 오후
    @지성님 리스트 안의 값이 변하지 않는 값이라면 가능하겠죠. 예시로 들어주신 리스트 a의 원소는 모두 딕셔너리의 key로 가능합니다. - 유지훈, 2021년 7월 26일 9:12 오전
    Python 독학중이라 여기 저기 자료를 찾아다니는데, 점프 투 파이썬이 설명이 제일 좋네요. 애독 중입니다. - Flow Minwoo, 2022년 1월 9일 8:17 오후
    @Flow Minwoo님 감사합니다. - 박응용, 2022년 1월 11일 7:17 오후
    keys 함수나 values 함수는 괄호 안에 값을 넣을 수 없나요? - JPGY, 2022년 7월 16일 1:59 오전
    진행도 저장은 없나요? 너무 쉽게 설명해 주셔서 시간 가는줄 모르고 봤네요 감사합니다. ㅎㅎ - 영우, 2022년 9월 19일 10:52 오후
    @영우님 위키독스에 책갈피 비슷한 기능을 추가할 예정입니다. 현재는 없습니다. - 박응용, 2022년 9월 20일 8:13 오전
    ※ 댓글 작성은 로그인이 필요합니다. (또는 피드백을 이용해 주세요.)
    • 이전글 : 02-4 튜플 자료형
    • 다음글 : 02-6 집합 자료형
    TOP

    이 페이지에 대한 피드백을 남겨주세요

    ※ 피드백은 저자에게 e-메일로 전달됩니다.

    댓글을 신고합니다.

    해당 댓글을 신고하시겠습니까? 댓글 신고는 다음과 같은 경우에 사용해주세요:
    1. 스팸 또는 광고성 내용이 포함된 경우
    2. 욕설, 비방, 개인정보 유출 등 부적절한 내용이 포함된 경우
    3. 저작권을 침해하는 내용이 포함된 경우

    ※ 신고하신 내용은 관리자에게 전달되며, 확인 후 적절한 조치가 이루어집니다. 신고는 익명으로 처리되며, 신고자의 정보는 공개되지 않습니다.