파이썬 강좌 4-5편. 사전(Dictionary)
1. 사전(Dictionary)
이번에는 사전(Dictionary)에 대해서 알아보도록 하겠습니다. 사전이란 우리가 흔히 알고있는 국어사전, 영어사전 등과 같이 단어와 뜻이 한 쌍이듯이 파이썬에서의 사전도 키(Key)와 값(Value)이 한 쌍으로 이루어져 있습니다. 이런 사전은 튜플이나 리스트와는 다르게 위치를 통한 인덱싱이 허용되지 않습니다. 그 대신, 키를 통해서 값을 찾을 수는 있습니다. 사전을 어떻게 만들 수 있는지 사전의 형식을 한번 보도록 합시다.
1 2 3 4 5 | >>> dic = { 'name' : 'Smith' , 'rank' : 1 , 'average' : 97.5 } >>> type (dic) < class 'dict' > >>> dic { 'name' : 'Smith' , 'average' : 97.5 , 'rank' : 1 } |
우선, 위 예제의 1행을 보시면 사전 형식의 변수 dic이 보이는데 키와 값들을 중괄호로 묶은 것을 보실 수 있습니다. 또한, 키와 값은 콜론(:)으로 구분이 되는 것 또한 알 수 있습니다. 예를 들어서, 저기에서는 키가 'name', 'rank', 'average'이며 값은 'Smith', 1, 97.5와 같이 서로 쌍을 이룹니다. 저기선 키가 모두 문자열이지만, 숫자도 될 수 있으며 튜플도 사용할 수 있습니다. 하지만 리스트나 사전은 키로 사용하지 못합니다.
1 2 3 | >>> dic = { 123 : 456 , 3.14 : 41.3 , ( 1 , 3 ):( 3 , 1 ), 'abc' : 'def' , 'list' :{ 1 , 2 , 3 }, 'dict' :{ 1 : 2 , 3 : 4 , 5 : 6 }} >>> dic { 'dict' : { 1 : 2 , 3 : 4 , 5 : 6 }, 3.14 : 41.3 , ( 1 , 3 ): ( 3 , 1 ), 'abc' : 'def' , 'list' : { 1 , 2 , 3 }, 123 : 456 } |
위 예제를 살펴보시면 여러가지 형식의 키와 값이 존재합니다. 키와는 다르게 값에는 어떠한 형식의 데이터라도 들어가는 것을 보실 수 있고, 이번에는 키를 통해서 값을 가져와 보도록 하겠습니다.
1 2 3 4 5 6 7 8 9 10 | >>> dic = { 'name' : 'John' , 'age' : 21 , 'e-mail' : 'john33@abc.com' } >>> dic[ 'name' ] 'John' >>> dic[ 'age' ] 21 >>> dic[ 0 ] Traceback (most recent call last): File " , line 1 , in
dic[ 0 ] KeyError: 0 |
위 예제에서는 2행과 4행을 보시면 '사전명[키]' 이러한 식으로 키에 해당하는 값을 가져오는 것을 볼 수 있습니다. 그러나 6행과 같이 위치를 통해서는 값을 가져오지 못하며, 이는 사전에서 자료의 순서라는 개념이 존재하지 않아 위치를 통한 인덱싱이 불가능하고, 이런 인덱싱이 불가능하니 우리가 생각하는 슬라이싱도 불가능 하다는 것을 알 수 있습니다. 보는 그대로 값을 가져오려면 위처럼 키를 통해 값을 가져와야 합니다.
1 2 3 4 5 | >>> dic = { 'key1' : 'value1' , 'key2' : 'value2' } >>> dic[ 'key1' ] = 'value3' >>> dic[ 'key2' ] = 'value4' >>> dic { 'key2' : 'value4' , 'key1' : 'value3' } |
또한, 위 예제를 통해서 키를 통해 값을 변경할 수 있다는 사실을 알 수 있습니다. 그러나 키값은 변경할 수 없습니다. 주의할 점이 한가지 더 있는데, 그것은 사전에서 키가 중복되면 안됩니다. 물론, 같은 키에다 다른 값을 가진 두개의 요소가 존재할 수 있지만 어느 값을 가져올지 모르며 다른 하나가 무시될 수 있습니다. 그리고 사전에서 요소를 제거하려면 del라는 내장 함수를 사용하면 됩니다. 아래와 같이 말이죠.
1 2 3 4 5 6 | >>> dic = { 'a' : 'b' , 'c' : 'd' , 'e' : 'f' } >>> dic { 'e' : 'f' , 'c' : 'd' , 'a' : 'b' } >>> del dic[ 'a' ] >>> dic { 'e' : 'f' , 'c' : 'd' } |
위와 같이 del 함수를 사용하여 요소를 제거할 수 있으며, 이 del 함수는 사전의 요소뿐만 아니라 리스트, 변수, 함수 등 제거할 수 있는것이 여러가지가 있습니다. 간단하죠?
2. 관련 함수
두번째로, 사전에 관련된 함수를 차례대로 보도록 하겠습니다. keys, values, items, clear, in 이렇게 총 6개의 함수와 대해서 알아보도록 합시다. 처음부터 keys 함수를 보도록 하겠습니다.
사전 - 사전 키 리스트(keys) 함수
먼저 아래의 예제를 보도록 합시다.
1 2 3 | >>> dic = { 'name' : 'Smith' , 'phone' : '01131313131' , 'age' : 18 } >>> dic.keys() dict_keys([ 'name' , 'age' , 'phone' ]) |
위 예제에서 keys 함수를 사용하면 3행과 같이 dict_keys 객체를 내보냅니다. 이 dict_keys 객체는 사전의 키를 모아서 만든 것이라고 할 수 있습니다. 아직 반복문은 배우지 않았으나, for라는 녀석을 통해 keys 함수가 내뱉는 dict_keys 객체를 통해서 순회하여 접근할 수 있습니다.
1 2 3 4 5 6 7 | >>> dic = { 'name' : 'Smith' , 'phone' : '01131313131' , 'age' : 18 } >>> for i in dic.keys(): print (i) name age phone |
사전 - 사전 값 리스트(values) 함수
아래의 예제를 보도록 합시다.
1 2 3 | >>> dic = { 'name' : 'Smith' , 'phone' : '01131313131' , 'age' : 18 } >>> dic.values() dict_values([ 'Smith' , 18 , '01131313131' ]) |
사전 키 리스트를 얻는 keys 함수와 동일하게, 이번에는 키가 아니라 값만을 가져오고 싶다면 values 함수를 사용하면 됩니다. values 함수도 비슷하게 dict_values 객체를 내보내며 이 객체는 사전의 값을 모아서 만든 것이라고 할 수 있습니다. 동일하게 반복문을 통해서 values 함수가 내뱉는 dict_values 객체를 통해서 순회하여 접근할 수 있습니다.
사전 - 사전 키와 값으로 이루어진 쌍 리스트(items) 함수
우선은 아래의 예제를 보도록 합시다.
1 2 3 | >>> dic = { 'name' : 'Smith' , 'phone' : '01131313131' , 'age' : 18 } >>> dic.items() dict_items([( 'name' , 'Smith' ), ( 'age' , 18 ), ( 'phone' , '01131313131' )]) |
이번에는 키와 값을 요소로 지니는 여러개의 튜플을 리스트로 돌려줍니다. items 함수는 dict_items 객체를 내보냅니다.
사전 - 사전 초기화(clear) 함수
우선은 아래 예제를 보도록 합시다.
1 2 3 4 5 6 | >>> dic = { 'name' : 'Smith' , 'phone' : '01131313131' , 'age' : 18 } >>> dic { 'name' : 'Smith' , 'age' : 18 , 'phone' : '01131313131' } >>> dic.clear() >>> dic {} |
이 clear 함수는 사전의 요소를 모두 제거하여 초기화 시키는 함수입니다. clear 함수를 사용하면 위 예제의 6행과 같이 요소가 모두 사라지게 됩니다.
사전 - 사전 키에 해당하는 값 반환(get) 함수
우선은 아래 예제를 보도록 합시다.
1 2 3 4 5 | >>> dic = { 'name' : 'Smith' , 'phone' : '01131313131' , 'age' : 18 } >>> dic.get( 'phone' ) '01131313131' >>> dic.get( 'age' ) 18 |
이 get 함수는 키에 해당하는 값을 돌려줍니다. 만약 키 phone에 해당하는 값을 가져오려면 'dic.get('phone')'처럼 get 함수를 이용하는 방법과 'dic['phone']'처럼 함수를 쓰지 않고도 직접 값을 가져오는 방법이 있습니다.
사전 - 사전 키 존재 여부 검사(in)
마지막으로 아래의 예제를 보도록 합시다.
1 2 3 4 5 | >>> dic = { 'name' : 'Smith' , 'phone' : '01131313131' , 'age' : 18 } >>> 'name' in dic True >>> 'job' in dic False |
파이썬에서 has_key라는 함수가 3.x 버전부터 사라지고, 이를 대체하여 in이라는 녀석을 통해 해당 키가 사전에 존재하는지 검사할 수 있습니다. 만약 존재하면 참(True)을, 존재하지 않다면 거짓(False)을 내보내게 됩니다. 2행을 보시면 키 'name'이 사전 dic에 있나 검사하는데 있으니 True를, 4행에서 키 'job'이 사전 dic에 있나 검사하는데 없으니 False을 내보내게 된겁니다. 유용하죠?