티스토리 뷰

파이썬(Python) Mapping/Set 자료형 딕셔너리

파이썬(Python) Mapping/Set 자료형 딕셔너리 기초



헬스클럽 회원이라면 “이름” = “홍길동”, “나이” = 30, “생일” = “몇 월 며칠” 등으로 구분할 수 있습니다. 이것을 연관 배열(Associative array) 또는 해시(Hash)라고 합니다.


키와 값을 쌍으로 데이터를 관리하는 매핑(Mapping) 자료형과 키로만 관리하는 집합(set) 자료형에 대해서 알아보겠습니다.


매핑 자료형과 집합 자료형은 여러 개의 원소를 관리하고 처리할 수 있는 collection 형태의 자료형입니다. 


키로 검색해서 읽기 위해서 유일성을 유지해야 하므로, 키를 생성할 때 해시(hash) 알고리즘을 통해 유일한 값을 가질 수 있도록 합니다.


파이썬 클래스에서 매핑 자료형은 딕셔너리, 집합형은 set, frozenset을 제공하며 이 중에 frozenset은 원소를 바꿀 수 없고, set은 원소를 바꿀 수 있습니다.


딕셔너리 알아보기

딕셔너리는 키(Key)와 값(Value)을 한 쌍으로 갖는 자료형입니다. apple은 ‘사과’라는 뜻입니다. apple이 키(Key)라면 ‘사과’는 값(Value)이라고 할 수 있습니다.


딕셔너리는 리스트처럼 인덱스를 써서 들어있는 값을 찾는 것이 아니라 키를 써서 찾습니다. 사전에서 한글 자음이나 알파벳 순서를 보고 단어를 찾듯이, 키를 찾아 짝을 이루는 값을  확인하는 것입니다.


딕셔너리는 중괄호({ }) 안에 키와 값을 넣어 정보를 저장합니다. 키를 만들 때는 주민등록번호와 같이 유일한 값을 사용해야 합니다. 따라서 키에는 값이 바뀌는 객체는 쓸 수 없습니다. 


키는 유일성을 유지하는 자료형만 사용할 수 있지만, 값으로는 모든 자료형을 사용할 수 있습니다. 리터럴 표기법으로 딕셔너리 객체를 만듭니다. 빈 딕셔너리를 만들 것이므로 중괄호만 써서 표시합니다.


문자열로 키를 만들고 값은 정수를 넣어서 딕셔너리를 만듭니다. 그리고 변수 d1에 할당합니다. 변수 d1를 확인하면 딕셔너리 객체를 가리키는 것을 알 수 있습니다. 


딕셔너리도 검색연산자를 이용해서 값을 가져올 수 있습니다. 이때 딕셔너리에 있는 키를 이용해서 값을 찾아야 합니다.


리터럴 표기법으로 튜플 객체를 가지는 리스트를 만들어 변수에 할당합니다. 이 튜플 객체는 2개의 원소를 갖고 있습니다. 값을 찾으려면 두 개의 검색연산자를 사용해야 합니다.


이와 같은 구조는 딕셔너리를 이용해서 키와 값으로 저장하는 것이 더 편합니다. 이런 구조의 리스트가 있다면 딕셔너리 클래스의 인자로 전달해서 딕셔너리 객체를 만든 후에 처리하는 것이 더 편합니다.


딕셔너리 메소드 알아보기

이번에는 파이썬 내장 클래스인 딕셔너리로 객체를 만든 후에 이 객체가 지원하는 메소드들을 알아보겠습니다.


먼저 튜플을 원소로 가진 리스트를 만듭니다. 이를 dict 클래스의 인자로 전달해서 딕셔너리 객체를 만듭니다. 


그리고 만들어진 객체를 조회하면 키와 값으로 구성된 것을 확인할 수 있습니다.


딕셔너리 객체가 만들어지면 내부의 값을 조회하는 유일한 키가 만들어집니다. 어떤  키가 있는지는 in 키워드로 확인할 수 있습니다.


없는 키인 ‘키3’ 문자열을 가지고 딕셔너리 객체에 있는지를 확인하면 False를 표시합니다.


앞에서 키가 있는 지를 확인한 이유는 딕셔너리도 검색연산자를 통해 내부의값을 가져올 수 있기 때문입니다. 이 연산자를 마구 사용하기 전에 이 연산자의 이슈를 하나 알아봅시다. 


바로 해당 키가 없을 때 에러를 발생시킨다는 것입니다. 아래의 예제처럼 검색연산자에 없는 키를 넣어서 조회하면 KeyError가 발생합니다.


딕셔너리의 내부의 값을 조회해서 사용할 때 에러없이 처리할 수 있도록 두 개의 메소드 get이나 setdefault를 제공합니다.


단순히 값을 검색할 때는 메소드 get에 키값과 검색할 때 해당 키가 없을 때 반환값을 넣어서 처리합니다. 이 메소드가 실행되면 에러가 발생하지 않고 인자로 전달된 값이 반환되는 것을 알 수 있습니다.


혹시 키가 없을 경우에는 전달된 값을 갱신할 수도 있습니다. 이때는 setdefault 메소드를 사용합니다.

앞에서 처리한 get 메소드와 동일한 인자가 전달되지만 처리하는 방식이 조금 다릅니다.


이 메소드 처리 방식은 찾으려는 키가 없으면 딕셔너리 객체에 ‘키 : 디폴트값’을 값을 넣어서 새로운 키가 들어갑니다. 검색한 키가 있으면 조회한 결과를 그대로 반환합니다.


딕셔너리 객체에 키가 없는 원소를 넣을 때는 update 메소드를 이용해서 추가할 수 있습니다. 삭제할 때는 pop 메소드를 사용합니다.


딕셔너리의 원소들을 분리해서 처리하기

딕셔너리 객체의 원소를 하나씩만 조회하는 것 외에도 내부에 있는 키들만 조회하는 것 또는 값들만 조회하는 것도 가능합니다. 


또한 키와 값을 쌍으로 구성되도록 조회하는 것도 가능합니다. 딕셔너리 객체를 하나 다시 dict 클래스를 사용하여 객체를 생성합니다.


딕셔너리 내부에 있는 키만 조회하는 keys 메소드를 사용합니다. 이 메소드 실행되면 dict_kyes라는 객체가 만들어진 것을 볼 수 있습니다.


이 객체를 리스트로 바로 변환해서 사용하려면 리스트 내부에서 메소드를 실행하고 앞에 별표를 붙이면 내부의 원소만 추출되는 것을 볼 수 있습니다.

[*딕셔너리 객체.keys()]

[*딕셔너리 객체]


딕셔너리 객체에서 값만 가져오려면 values 메소드 사용합니다. 이것을 리스트의 리터럴 표기법에 넣고 별표를 붙이면 값이 모두 리스트 객체에 들어갑니다.


items 메소드를 사용하면 딕셔너리 객체의 키와 값을 가져옵니다. 이것을 리스트 내에 넣어서 별표를 붙이면 키와 값이 튜플로 묶여 리스트 객체에 들어갑니다.


댓글
댓글쓰기 폼