관리 메뉴

개발자비행일지

파이썬 딕셔너리 본문

▶ Python

파이썬 딕셔너리

Cyber0946 2020. 7. 10. 17:21

파이썬 딕셔너리 변수에 적용가능한 함수에 대해 알아보자. 

https://blog.naver.com/sw4r/221504100256

키(key) 뽑아 내기

앞에서도 다루었듯이, 기본적으로 딕셔너리는 키와 값의 쌍으로 이루어진 데이터 타입이다. 그런데 가끔씩 키(key)만 뽑아 내고 싶을 때가 있다. 그럴 때에는 .keys() 라는 함수를 사용해서 키만 뽑아 낼 수 있다. 아래와 같이 dic1 이라는 딕셔너리를 먼저 정의하고, 해당 object에 .keys() 라는 함수를 적용시켜 보자.

그랬더니, 앞에서 정의된 키-값에서 키에 해당하는 내용들만 따로 리스트로 담기는 것을 확인할 수 있다. 그런데 순서가 또 엉망이다. 그래서 궁금해서, 그냥 dic1 객체는 어떤 순서로 되는지 확인해보았다. 최소한 이것과 같은 순서로 키를 가져 오면, 순서성을 생각하면 될 거라고 생각했는데,

결과를 보니, dic1을 출력해보니, 이 순서와 일치하지 않는다. 사실 딕셔너리 자체에서는 순서가 의미가 없을 수 있다. 왜냐하면 순서가 쓰일 때가 없으니깐! 리스트에서는 순서를 알아야 해당 원소를 뽑아 내는데, 딕셔너리에서는 순서를 몰라도, 해당 키만 넣으면 값을 빼내올 수 있다. 그러한 시스템의 데이터 변수이므로, 순서가 의미가 없는데, 이렇게 키만 가져왔을 때에는 리스트가 되기 때문에 순서를 생각해야 하는데, 이 순서가 앞에서 정의한 딕셔너리에서의 순서로부터 힌트를 얻을 수 없다는 것을 기억하자.

그런데 여기서 또 기억해야 할 것이 있는데, 파이썬 버전에 따라서, key를 뽑아 왔을 때의 데이터 타입이 다르다는 것이다. 3.0 버전 이전에는 위에서와 같이 바로 리스트로 key를 가져와 준다. 즉, 아래와 같이 type 함수를 사용해서 확인해보면 리스트라는 것을 알 수 있다.

하지만, 파이썬 3.0 이상부터는 따로, dict_keys 라는 객체를 생성한다. 즉, 아래와 같이, 동일한 명령어를 수행시켜 보면, 그냥 리스트가 나오지 않는다.

이것도 타입을 확인해보면 아래와 같이 dict_keys 라는 타입으로 보인다. (리스트가 아니다)

그래서, 파이썬 3.0 이상 버전부터는 리스트로 키를 가져오고 싶다면, list 함수로 다시 한번 감싸 줘야 한다.

위와 같이 리스트로 감싸주면 키가 리스트로 반환된다.


값(value) 뽑아 내기

앞에서 키만 따로 뽑았으니, 값도 따로 뽑을 수 있지 않겠는가? 그건 .values() 함수를 통해서 동일한 방식으로 가능하다. 그런데 이것도 keys()와 마찬가지로, 버전에 따라서, 다른데, 앞에서와 동일한 원리가 적용된다.

위의 코드는 2.7버전에서의 결과이고,

위의 코드는 3.0버전 이상에서의 결과이다. 아! 그리고 여기서 다행인 점은 키만 뽑았을 때의 순서와 값만 뽑았을 때의 순서가 동일하다는 점이다. 이것마저 다르다면, 이후에 상당히 쓰기 어려운 정보가 될 것 같았는데, 역시 상식적인 수준에서 움직이는 느낌이다.


키(key) : 값(value) 쌍 뽑아내기

당연히 키와 값을 각각 뽑아 냈다면, 한꺼번에도 뽑아낼 수 있겠지? 그래서 이번에는 키-값 쌍을 한 꺼번에 뽑아 내보도록 하자. 이것은 단순히 .items() 함수를 사용함으로서 가능하다. 아래에 결과를 보자.

여기서 주의 깊게 봐야 할 것은 결과가 리스트라고 한다. 물론 버전 3.0에서는 아래와 같이 타입을 보면, dict_items 라고 한다. 그런데 이것 보다 중요 한 것이 있다.

키와 값이 쌍으로 있다고 했는데, 그것들이 리스트라는 것은 각 리스트의 하나의 원소가 쌍이라는 이야기가 된다. 그렇다면 이 쌍은 또 하나의 리스트인가? 했는데, 타입을 0번째 원소에 대해서 확인해보니, 아래와 같이 튜플이라고 밝혀 졌다. 즉, 키-값 쌍으로 items() 함수를 사용해서 불러들일 경우, 튜플이 리스트의 원소가 되어서 반환된다는 것을 기억하자!


키(key)를 사용해서 값(value) 반환하기

이번에는 키를 입력으로 주고, 값을 반환하는 방법에 대해서 알아보자. 먼저 아래와 같이 간단한 딕셔너리를 만들어 보았다.

그리고는 기본적인 형태로, 그냥 []를 사용해서 인자를 넣는 방식으로 해보자.

위의 경우, 숫자 123을 인자 즉, 키로 넣었을 때, 그에 상응하는 값인 Number 이라는 문자열이 반환된다. 이와 마찬가지로, 해당 키의 타입에 맞게 인자를 넣어주면 해당 키에 대한 값이 반환된다. Name이라는 것은 문자열이므로, 당연히 ' ' 를 씌워서 인자에 넣어 주어야 하고, 그랬을 때 상응하는 값이 나온다. 그런데 만약에 아래와 같이, 기존에 정의하지 않은 키를 넣어 보자. 그러면 어떻게 되는가? 키가 에러라고 뜬다.

자, 그러면 조금 다른 방법으로 값을 반환해보자. 바로 .get() 함수를 사용하는 방법에 대해서 알아보자. get() 함수는 아래와 같이 딕셔너리 객체에 대해서 매소드 형식으로 사용하며, 인자로 앞에서와 동일하게 키를 넣어준다. 앞에서와 동일한 결과가 나온 것을 확인할 수 있다.

그런데 앞에서와 같이 존재하지 않는 키를 넣어주면 이 경우 어떻게 되나?

위와 같이 None 값을 반환하고, 이것을 타입으로 확인해보았다. 이번에는 디폴트 값을 정하는 방법에 대해서 알아보자. 디폴트라고 한다면, 항상 정의 되어 있지 않은 키를 넣었을 때에는 디폴트의 값을 반환하라고 하는 것이다. 이것 역시 .get() 함수를 사용하여 구현할 수 있고, 디폴트 값은 두 번째 인자로 넣어 주면 된다. 아래의 경우를 분석한다면, nono 라는 문자열이 dic 이라는 딕셔너리 객체에 존재하지 않는 키이므로, None을 반환해야 하지만, default!! 라는 문자열을 디폴트로 지정하라고 인자를 넣어 두었으니, 결과로 반환하는 것이 default!! 라는 문자열이 된다는 것을 확인할 수 있다.


키(key) 내부에 존재하는 원소인지 아닌지 확인하기!

in 이라는 것을 사용해서 아래와 같이 해당 딕셔너리 내에 키들 중에서 어떠한 원소를 존재유무를 확인할 수 있다.

앞에서 dic 이라는 딕셔너리 안에는 Name 이라는 원소는 존재하지만, name 이라는 원소는 존재하지 않는다. (대소문자 구분하는거 겸으로 확인!) 그래서 해당 키 안에 있으면 True를 그렇지 않으면 False를 반환한다.

여기서 기억해야 할 것은 딕셔너리에서 in으로 원소를 확인할 때에는 키(key)를 기준으로 훑어 본다는 것이다!


비어 있는 딕셔너리 만들기!

마지막으로 단순한거 하나만 더 확인하고 포스팅을 마무리 하자. 빈 딕셔너리를 만드는 것에 대해서 생각해보자. 빈 딕셔너리를 만들라고 하면, 아주 쉽게 아래와 같이 할 수 있다.

그런데 만약에 기존에 어떠한 값들이 이미 세팅 되어 있는 딕셔너리에 대해서 그 값들을 모두 제거하고 빈 딕셔너리로 만들라고 한다면, 어떻게 해야 할까? 아주 단순하다. .clear() 함수를 적용하면 아래서 내부의 키와 값들을 모두 지워 주고, 빈 딕셔너리를 만들어준다.

즉, 위와 같이 기존에 앞에서 계속 작업하던 dic 이라는 딕셔너리가 있을 때, .clear() 함수를 적용하면, 기존의 dic을 빈 딕셔너리로 업데이트 시킨다. 그래서 그 이후에 dic을 불러 오면 위와 같이 {} 빈 딕셔너리가 보인다.