Media Log

1. 사전(Dictionary)


이번에는 사전(Dictionary)에 대해서 알아보도록 하겠습니다. 사전이란 우리가 흔히 알고있는 국어사전, 영어사전 등과 같이 단어와 뜻이 한 쌍이듯이 파이썬에서의 사전도 키(Key)와 값(Value)이 한 쌍으로 이루어져 있습니다. 이런 사전은 튜플이나 리스트와는 다르게 위치를 통한 인덱싱이 허용되지 않습니다. 그 대신, 키를 통해서 값을 찾을 수는 있습니다. 사전을 어떻게 만들 수 있는지 사전의 형식을 한번 보도록 합시다.

>>> 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와 같이 서로 쌍을 이룹니다. 저기선 키가 모두 문자열이지만, 숫자도 될 수 있으며 튜플도 사용할 수 있습니다. 하지만 리스트나 사전은 키로 사용하지 못합니다.

>>> 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}

위 예제를 살펴보시면 여러가지 형식의 키와 값이 존재합니다. 키와는 다르게 값에는 어떠한 형식의 데이터라도 들어가는 것을 보실 수 있고, 이번에는 키를 통해서 값을 가져와 보도록 하겠습니다.

>>> dic = {'name':'John', 'age':21, 'e-mail':'john33@abc.com'}
>>> dic['name']
'John'
>>> dic['age']
21
>>> dic[0]
Traceback (most recent call last):
  File "<pyshell#18>", line 1, in <module>
    dic[0]
KeyError: 0

위 예제에서는 2행과 4행을 보시면 '사전명[키]' 이러한 식으로 키에 해당하는 값을 가져오는 것을 볼 수 있습니다. 그러나 6행과 같이 위치를 통해서는 값을 가져오지 못하며, 이는 사전에서 자료의 순서라는 개념이 존재하지 않아 위치를 통한 인덱싱이 불가능하고, 이런 인덱싱이 불가능하니 우리가 생각하는 슬라이싱도 불가능 하다는 것을 알 수 있습니다. 보는 그대로 값을 가져오려면 위처럼 키를 통해 값을 가져와야 합니다.

>>> dic = {'key1':'value1', 'key2':'value2'}
>>> dic['key1'] = 'value3'
>>> dic['key2'] = 'value4'
>>> dic
{'key2': 'value4', 'key1': 'value3'}

또한, 위 예제를 통해서 키를 통해 값을 변경할 수 있다는 사실을 알 수 있습니다. 그러나 키값은 변경할 수 없습니다. 주의할 점이 한가지 더 있는데, 그것은 사전에서 키가 중복되면 안됩니다. 물론, 같은 키에다 다른 값을 가진 두개의 요소가 존재할 수 있지만 어느 값을 가져올지 모르며 다른 하나가 무시될 수 있습니다. 그리고 사전에서 요소를 제거하려면 del라는 내장 함수를 사용하면 됩니다. 아래와 같이 말이죠.

>>> 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) 함수


먼저 아래의 예제를 보도록 합시다.

>>> dic = {'name':'Smith', 'phone':'01131313131', 'age':18}
>>> dic.keys()
dict_keys(['name', 'age', 'phone'])

위 예제에서 keys 함수를 사용하면 3행과 같이 dict_keys 객체를 내보냅니다. 이 dict_keys 객체는 사전의 키를 모아서 만든 것이라고 할 수 있습니다. 아직 반복문은 배우지 않았으나, for라는 녀석을 통해 keys 함수가 내뱉는 dict_keys 객체를 통해서 순회하여 접근할 수 있습니다.

>>> dic = {'name':'Smith', 'phone':'01131313131', 'age':18}
>>> for i in dic.keys():
	print(i)

name
age
phone

  사전 - 사전 값 리스트(values) 함수


아래의 예제를 보도록 합시다.

>>> dic = {'name':'Smith', 'phone':'01131313131', 'age':18}
>>> dic.values()
dict_values(['Smith', 18, '01131313131'])

사전 키 리스트를 얻는 keys 함수와 동일하게, 이번에는 키가 아니라 값만을 가져오고 싶다면 values 함수를 사용하면 됩니다. values 함수도 비슷하게 dict_values 객체를 내보내며 이 객체는 사전의 값을 모아서 만든 것이라고 할 수 있습니다. 동일하게 반복문을 통해서 values 함수가 내뱉는 dict_values 객체를 통해서 순회하여 접근할 수 있습니다.


  사전 - 사전 키와 값으로 이루어진 쌍 리스트(items) 함수


우선은 아래의 예제를 보도록 합시다.

>>> dic = {'name':'Smith', 'phone':'01131313131', 'age':18}
>>> dic.items()
dict_items([('name', 'Smith'), ('age', 18), ('phone', '01131313131')])

이번에는 키와 값을 요소로 지니는 여러개의 튜플을 리스트로 돌려줍니다. items 함수는 dict_items 객체를 내보냅니다.


  사전 - 사전 초기화(clear) 함수


우선은 아래 예제를 보도록 합시다.

>>> dic = {'name':'Smith', 'phone':'01131313131', 'age':18}
>>> dic
{'name': 'Smith', 'age': 18, 'phone': '01131313131'}
>>> dic.clear()
>>> dic
{}

이 clear 함수는 사전의 요소를 모두 제거하여 초기화 시키는 함수입니다. clear 함수를 사용하면 위 예제의 6행과 같이 요소가 모두 사라지게 됩니다.


  사전 - 사전 키에 해당하는 값 반환(get) 함수


우선은 아래 예제를 보도록 합시다.

>>> dic = {'name':'Smith', 'phone':'01131313131', 'age':18}
>>> dic.get('phone')
'01131313131'
>>> dic.get('age')
18

이 get 함수는 키에 해당하는 값을 돌려줍니다. 만약 키 phone에 해당하는 값을 가져오려면 'dic.get('phone')'처럼 get 함수를 이용하는 방법과 'dic['phone']'처럼 함수를 쓰지 않고도 직접 값을 가져오는 방법이 있습니다.


  사전 - 사전 키 존재 여부 검사(in)

마지막으로 아래의 예제를 보도록 합시다.

>>> 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을 내보내게 된겁니다. 유용하죠?


사전에 대한 설명은 여기서 그만하고, 다음 편에서는 논리 연산자와 부울에 대해 간단히 알아보도록 하겠습니다. 모두들 읽느라 수고하셨습니다.

저작자 표시 비영리 변경 금지
신고
  1. ZiNee at 2013.09.11 23:05 신고 [edit/del]

    명강의 잘 읽었습니다. 다음 강좌도 기대됩니다.

    Reply
  2. 인문대공돌이 at 2013.11.27 20:45 신고 [edit/del]

    강의 감사드립니다.
    사전 존재 키 여부확인하는 검사에서 2.7버전에서는 has_key를 어떻게 사용하느지 알수 있을까요>?>>

    Reply
  3. at 2014.03.24 22:39 [edit/del]

    비밀댓글입니다

    Reply
    • BlogIcon EXYNOA at 2014.03.27 20:18 신고 [edit/del]

      우선은 도움은 드릴 수 있는데 스케쥴 때문에 시간대가 맞을지 궁금하네요. 네이트온 이메일인가요? 아직 해결되지 않은 과제라면 다시 덧글로 남겨주세요. 메일로 자세한 사항을 남겨드리겠습니다.

  4. at 2014.03.29 01:23 [edit/del]

    비밀댓글입니다

    Reply
  5. 이찬영 at 2014.05.01 11:31 신고 [edit/del]

    잘 읽었습니다. 근데 사전을 만들고 그것을 다시 보면 왜 애초에 적혔던 순서랑 바뀌어서 표현되는지 궁금합니다. 아마 Hashing 기법 떄문에 그런것같은데. 정리가 자동으로 되는데 그 기준이 뭔지 궁금합니다.

    Reply
    • BlogIcon EXYNOA at 2014.05.01 21:19 신고 [edit/del]

      말 그대로 사전 형식은 해싱 기법을 이용합니다. 파이썬에서 지원하는 Dictionary는 자료는 기억하고 있으나, 순서를 기억하지 않아 순서가 생각과는 다르게 어긋날 수 있습니다. 즉, 출력되는 결과에서의 사전 자료 순서는 아무런 의미를 지니지 않는다는 겁니다. 출력될 때만 한하여 임의의 순서를 가지고 출력된다고 생각하시면 되겠습니다.

  6. 독학생 at 2014.05.06 00:01 신고 [edit/del]

    안녕하세요. 차근차근 공부하는 중입니다. 혹시 사전에 내용을 추가할 수는 없나요? del dic['key'] 를 통해 제거하고 새로운 key,value 쌍을 넣고 싶을 경우에는 어떻게 하는지요~

    Reply
    • BlogIcon EXYNOA at 2014.05.06 01:36 신고 [edit/del]

      기존 사전 객체에 요소를 추가하시려면 아래와 같은 형태로 그저 대입하시면 됩니다.
      dic['key'] = value

    • 독학생 at 2014.05.06 17:48 신고 [edit/del]

      답변 감사합니다. 본문에는 키의 값을 변경할 때 dic['key']=value2 를 이용해서 기존의 value를 변경하는 것만 되어있어서 혹시나 key값을 지웠을때 어떻게 하는지 궁금했습니다. 키가 존재 하지 않은 상태여도 키를 변경하듯이 쓰면 key,value 쌍이 들어가는군요. 본문에 추가하면 좋을 듯 싶습니다. 연휴 잘 마무리하세요 ^^

    • BlogIcon EXYNOA at 2014.05.06 17:51 신고 [edit/del]

      독학생님도 연휴 잘 마무리하시고 해당 내용을 본문에 추가하도록 하겠습니다. 감사합니다 (_ _)/

  7. 궁금 at 2014.06.27 18:07 신고 [edit/del]

    dic에서 한글은 입력하지 못하나요??

    Reply
  8. 한우철 at 2014.06.27 22:04 신고 [edit/del]

    안녕하세요
    열심히 강의 듣고 있는 열혈 대학생입니다.
    근데 dic을 선언하고 나서 불러올때 왜 안에 있는 순서가 바뀌는지 궁금합니다.
    어떠한 순서가 있느지요?

    Reply
    • BlogIcon EXYNOA at 2014.06.30 16:57 신고 [edit/del]

      위의 덧글을 참조해 주세요.

      '파이썬에서 지원하는 Dictionary는 자료는 기억하고 있으나, 순서를 기억하지 않아 순서가 생각과는 다르게 어긋날 수 있습니다. 즉, 출력되는 결과에서의 사전 자료 순서는 아무런 의미를 지니지 않는다는 겁니다. 출력될 때만 한하여 임의의 순서를 가지고 출력된다고 생각하시면 되겠습니다.'

  9. ? at 2014.08.15 17:13 신고 [edit/del]

    Dictionary 추가는 어떻게 하나요? append를 사용하면 될 것 같기는 한데 잘 모르겠네요.

    Reply
  10. YO at 2014.08.31 23:13 신고 [edit/del]

    안녕하세요 파이썬 한번 배워보려하는 학생입니다.
    혹시 나중에 질문할게 생기면 물어볼수있는 연락방법이라도...?

    Reply
  11. 문선욱 at 2014.09.01 21:44 신고 [edit/del]

    1.사전에서 사전은 리스트와 사전을 키로 허용하지않는다고 되있는데 예제에서는 키로 리스트가 사용된것같은데 키로사용된건가요 아니면 사전안에 리스트가 있는건가요?

    Reply
  12. 문선욱 at 2014.09.01 22:05 신고 [edit/del]

    사전에서 값을 한글로 한상태에서 키를통해서 값을 부를때, 한글로 나타나지않고 '\xb9\xae\xbc\xb1\xbf\xed'
    이렇게 나타나는데 무엇을 고쳐야 하나요?

    Reply
  13. 수니 at 2014.11.20 17:42 신고 [edit/del]

    2.7.6 버전 사용하고 있는데요 ㅠㅜ
    키값 사전 키 리스트 함수 사용하는데 for문 입력하면 에러가 나네여 ㅠㅜ
    for i in dic.keys():
    print(i)
    File "<stdin>", line 2
    print(i)
    ^
    IndentationError: expected an indented block

    어떻게 수정해야할까요 ㅠㅜ

    Reply
  14. 토토 at 2015.02.09 16:12 신고 [edit/del]

    이렇게 이해하기 쉽게 설명해주셔서 감사드린다는 말 꼭 드리고싶어서 댓글 남깁니다~^^

    Reply
  15. 수강생 at 2015.02.12 11:46 신고 [edit/del]

    쌍 리스트(items) 함수 설명중에 "values 함수는 dict_items 객체를 내보냅니다."에서 values를 items로 변경하셔야 할듯 합니다.

    Reply

submit

티스토리 툴바