본문 바로가기

Etc/Python

#05 자료형-3(딕셔너리, 집합 자료형)

 [ 딕셔너리 자료형 ]


 Dictionary(딕셔너리)란 연관배열이라 불리는 파이썬의 자료형이다.

 딕셔너리는 리스트나 튜플처럼 순차적으로(sequential) 해당 요소값을 구하지 않고 Key를 통해 Value를 얻는다. 이것이 바로 딕셔너리의 가장 큰 특징이다. baseball이라는 단어의 뜻을 찾기 위해 사전의 내용을 순차적으로 모두 검색하는 것이 아니라 baseball이라는 단어가 있는 곳만 펼쳐 보는 것이다.


 기본적인 딕셔너리의 모습 : {Key1:Value1, Key2:Value2, Key3:Value3 ...}

>>> dic = {'name':'pey', 'phone':'0119993323', 'birth': '1118'}

 위에서 Key는 각각 'name', 'phone', 'birth'이고, 각각의 Key에 해당하는 Value'pey', '0119993323', '1118'이 된다.


>>> a = {1:'hi'}

 Key로 정수값 1, Value로 'hi'라는 문자열을 사용한 예이다.


>>> a = {'a':[1,2,3]}

 Value에 리스트도 넣을 수 있다.




 딕셔너리 쌍 추가, 삭제하기


 딕셔너리는 순서를 따지지 않는다. 중요한 것은 "무엇추가되었는가"이다.


1. 딕셔너리 쌍 추가하기


>>> a = {1: 'a'}

>>> a[2] = 'b'

>>> a

{2: 'b', 1: 'a'}

 {1: 'a'}라는 딕셔너리에 a[2] = 'b'와 같이 입력하면 딕셔너리 a에 Key와 Value가 각각 2와'b'인 2 : 'b'라는 딕셔너리 쌍추가된다.


>>> a['name'] = 'pey'

{'name':'pey', 2: 'b', 1: 'a'}

 딕셔너리 a에 'name': 'pey'라는 추가되었다.


>>> a[3] = [1,2,3]

{'name': 'pey', 3: [1, 2, 3], 2: 'b', 1: 'a'}

 Key3, Value [1, 2, 3]을 가지는 한 쌍이 또 추가되었다.


2. 딕셔너리 요소 삭제하기


>>> del a[1]

>>> a

{'name': 'pey', 3: [1, 2, 3], 2: 'b'}

 del 함수를 사용해서 del a[key]처럼 입력하면 지정한 key에 해당하는 {key : value} 쌍이 삭제된다.




 딕셔너리를 사용하는 방법


 딕셔너리에서 Key 사용해 Value 얻기


>>> grade = {'pey': 10, 'julliet': 99}

>>> grade['pey']

10

>>> grade['julliet']

99


>>> dic = {'name':'pey', 'phone':'0119993323', 'birth': '1118'}

>>> dic['name']

'pey'

>>> dic['phone']

'0119993323'

>>> dic['birth']

'1118'


  딕셔너리 만들 때 주의할 사항


 먼저 딕셔너리에서 Key는 고유한 값이므로 중복되는 Key 값을 설정해 놓으면 하나를 제외한 나머지 것들이 모두 무시된다는 점을 주의해야 한다. 다음 예에서 볼 수 있듯이 동일한 Key 2개 존재할 경우 1:'a'라는 쌍이 무시된다. 이때 꼭 앞에 쓴 것이 무시되는 것은 아니고 어떤 것무시될지는 예측할 수 없다. 결론은 중복되는 Key를 사용하지 말라는 것이다.


>>> a = {1:'a', 1:'b'}

>>> a

{1: 'b'}


 또 한 가지 주의해야 할 사항은 Key리스트쓸 수 없다는 것이다. 하지만 튜플은 Key로 쓸 수 있다. 딕셔너리의 Key쓸 수 있느냐 없느냐는 Key가 변하는 값인지 변하지 않는 값인지에 달려 있다. 리스트는 그 값이 변할 수 있기 때문에 Key로 쓸 수 없는 것이다. 아래 예처럼 리스트를 Key로 설정하면 리스트를 키 값으로 사용할 수 없다는 형 오류(TypeError)가 발생한다.


>>> a = {[1,2] : 'hi'}

Traceback (most recent call last):

File "", line 1, in ?

TypeError: unhashable type


 Value에는 변하는 값이든 변하지 않는 값이든 상관없이 아무 값이나 넣을 수 있다.







[ 집합자료형 ]


 집합(set)은 집합에 관련된 것들을 쉽게 처리하기 위해 만들어진 자료형이다.

집합 자료형 set 키워드를 이용해 만들 수 있다.


>>> s1 = set([1,2,3]) >>> s1 

{1, 2, 3}


 위와 같이 set()의 괄호 안에 리스트를 입력하여 만들거나 아래와 같이 문자열을 입력하여 만들 수도 있다.


>>> s2 = set("Hello")

>>> s2 {'e', 'l', 'o', 'H'}


 하지만 결과값이 상당히 이상하다. 이 이유는 set의 특징 때문이다.

  • 중복을 허용하지 않는다.
  • 순서가 없다(Unordered).

 순서가 없기에 일단 인덱싱으로 값을 얻을 수 없다. 이부분은 딕셔너리와 같다. 그렇기에 set 자료형 데이터에 인덱싱으로 접근하려면 리스트나 튜플로 변환한 후에 해야 한다. ( 하지만 중복을 허용하지않는 특징은 자료형의 중복을 제거하기 위한 필터 역할로 종종 사용되기도 한다. )


>>> s1 = set([1,2,3])

>>> l1 = list(s1) [1, 2, 3] >>> l1[0] 1 >>> t1 = tuple(s1) >>> t1 (1, 2, 3) >>> t1[0] 1


 집합 자료형 활용법


교집합, 합집합, 차집합 구하기

 이는 set이 가장 유용하게 사용되는 경우이다.


일단 전제조건은 다음과 같다.


>>> s1 = set([1, 2, 3, 4, 5, 6])

>>> s2 = set([4, 5, 6, 7, 8, 9])


 1. 교집합

>>> s1 & s2 {4, 5, 6}

 이렇듯 '&' 기호를 사용하면 간단히 구할 수 있다. 

>>> s1.intersection(s2) 

{4, 5, 6}

 또는 intersection 함수를 사용하여도 똑같은 결과를 얻을 수 있다.


 2. 합집합

>>> s1 | s2

{1, 2, 3, 4, 5, 6, 7, 8, 9}

 위 처럼 '|' 파이프 라인을 사용하는 방법이나

>>> s1.union(s2)

{1, 2, 3, 4, 5, 6, 7, 8, 9}

 union 함수를 사용하는 방법이 있다.


 3. 차집합

>>> s1 - s2 {1, 2, 3} >>> s2 - s1 {8, 9, 7}

 단순히 '-'를 사용하는 방법이나.

>>> s1.difference(s2)

{1, 2, 3} >>> s2.difference(s1) {8, 9, 7}

 difference 함수를 사용하여도 된다.



'Etc > Python' 카테고리의 다른 글

#07 제어문 (if, while, for)  (0) 2016.11.28
#06 자료형의 참과 거짓, 변수  (0) 2016.11.27
#04 자료형-2(리스트, 튜플)  (0) 2016.11.24
#03 자료형-1(숫자형, 문자열 자료형)  (0) 2016.11.23
#02 기초문법  (0) 2016.11.22