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
  16. 에코위스키 at 2018.05.29 05:30 신고 [edit/del]

    강의 정말 잘 보고있습니다. 감사드립니다!

    Reply

submit

티스토리 툴바