본문 바로가기

Python

Data Type 자료형(딕셔너리, 세트, 자료형의 참과 거짓 및 변수)

 

딕셔너리는 리스트와 튜플과는 달리 순차적으로 해당 요소 값을 구하는 것이 아닌 , key값을 호출하여 value값을 리턴 받거나, value값을 호출하여 key값을 리턴 받는다. 예를 들면, 리그오브레전드에는 100여개가 넘는 챔피언(게임 속 캐릭터)이 있다. '징크스'라는 캐릭터에 체력량, 마나량, 공격속도, 공격데미지 등을 한번에 찾으려면 key값인 징크스를 호출하여 징크스의 value인 체력량, 마나량, 공격속도, 공격데미지등을 구할 수 있다. 굳이 하나하나씩 올라가보면서 찾는게 아닌 key값만 호출해서 찾는 엄청난 편리함이 있다. 딕셔너리는 양 끝에 {}로 감싸져있고, {Key1:Value1, Key2:Value2, Key3:Value3,...}로 표현된다. 딕셔너리는 대응관계를 나타나는 자료형인데, 파이썬에서는 이것이 가능하다. 이를 연관배열(Associative array) 또는 해시(Hash)라고 표현한다. 딕셔너리에서 중복되는 키를 사용할 경우, 랜덤으로 하나를 제외한 나머지 키가 무시된다. 그러니 절대 key를 중복해서 사용하지말자. 그리고 키 값에 리스트가 들어가면 에러 구문이 뜬다. 값에는 리스트가 들어갈 수 있는데, 키에는 리스트를 넣지말아야한다.

#딕셔너리의 예
Introduce = {'name':'Justin','Age':21,'Birth':20000902}
Key Value
name Justin
Age 21
Birth 20000902
  • 딕셔너리 쌍 추가, 삭제하기-요소를 삭제할때 a[2]를 인덱싱 기법이라고 생각하면 에러구문이 나올것이다.딕셔너리는 이와 달리 인덱싱 기법이 아닌 키를 호출하는 것이기 때문에 del a[2]일 경우, 2 : 'b'가 지워지는 것이다.
    #딕셔너리에 쌍 추가
    a = {1: 'a'}
    a[2] = 'b' # a에 {2:'b'} 쌍(키와 벨류 두가지를 뜻함) 추가
    a
    >> {2:'b', 1:'a'}
    
    #딕셔너리 요소 삭제
    del a[2] #키가 2인 쌍 삭제
    a
    >> {1:'a'}​
  • 딕셔너리에서 Key를 이용해 Value 얻기 - 리스트, 튜플 등에서는 인덱싱 혹은 슬라이싱 기법을 사용해서 요소 값을 구해냈다면, 딕셔너리는 키만 호출해도 쉽게 구할 수 있다.
    Introduce = {'name'='Justin','Age'=21,'Birth'=20000902}
    Introduce['name'] #변수[키]를 사용해 값을 호출한다. 
    >> 'Justin'
    Introduce['Age']
    >> 21
    Introduce['Birth']
    >> 20000902​
  • 딕셔너리 관련 함수-get을 이용한 값 호출 및 변수를 이용한 값 호출의 차이점은 get을 이용할 때 존재하지않는 키를 호출하면 None을 리턴하고,변수를 이용한 호출은 에러를 발생시킨다는 차이다.
    a = {'name':'pey','phone':'0109929292','birth':'000902'}
    print(a.keys()) #keys대신 values를 넣으면 값만 출력되고 items를 넣으면 쌍 모두 출력된다.
    >>dict_keys(['name', 'phone', 'birth']) #Python 3.0이후 버전은 dict_keys를 제외한 리스트만 출력된다.​
    
    #dict객체를 리스트로 출력하려면
    list(a.keys()) #value 및 item도 같음
    >>['name','phone','birth']
    
    #for문을 이용한 키값 출력 나중에 제어문에 for문에 대해 설명할 것이다.
    for a in a.keys(): 
    	print(k)
    
    >>>'name'
    'phone'
    'birth'
    
    #example of 'clear'
    a.clear() #딕셔너리 안에 있는 모든 요소를 삭제
    a
    >> {}
    
    #example of 'get'
    a = {'name':'pey','phone':'0109929292','birth':'000902'}
    a.get('name')
    >>'Justin'
  • 딕셔너리 안에 찾으려는 key값이 없을 경우, 미리 정해 둔 디폴트 값을 대신 가져오게 하고싶을 때는 get(x,'디폴트 값')을 사용하면 편리하다.
    a.get('foo','bar')
    >>'bar' #foo라는 키 값이 없음으로 디폴트 값인 'bar'를 리턴한다.​
  • 딕셔너리 안에 찾으려는 키가 있는 지 확인해보기 (in) - 코딩 작업중, 내가 이 key를 넣었는지 안넣었는지 확인하고 싶을 때, 쓸 수 있는 함수이다.
    a = {'name':'pey','phone':'0109929292','birth':'000902'}
    'name' in a
    >>True #참
    'address' in a
    >>False #거짓​

세트란 집합 자료형을 뜻하는데, 중학교 1학년때 수학시간에 배웠던 합집합, 교집합, 차집합 등 집합과  관련된 것들을 처리하기 위한 자료형이다. 집합 자료형 같은 경우는 순서가 아예 없고, 중복이 안된다. 리스트와 튜플은 순서가 있지만, 딕셔너리나 세트 같은 경우 순서가 정해져있지 않음으로써 인덱싱 및 슬라이싱을 사용할 수 없다. 인덱싱으로 접근 하려면 list(변수) 혹은 tuple(변수)를 사용하여 리스트 혹은 튜플로 전환후 인덱싱이 가능하다.

#example of 'set'
s1 = set([1,2,3,3]) #set()안에 리스트를 입력하거나 문자열을 넣어서 만들 수 있다.
s1
>> {1,2,3}

s2 = set('Hello')
s2
>> {'e','l','o','H'} # 'Hello'의 l이 2번 중복됨으로써 l하나가 삭제되고 순서가 뒤죽박죽이다.

list(s1) #위와 같은 방법으로 세트를 리스트 혹은 튜플로 변환이 되고, 튜플을 리스트 혹은 세트로 변환도 되고
>>[1,2,3] #리스트를 세트 혹은 튜플로도 변환이 된다.

tuple(s1)
>>(1,2,3)
  • 세트를 이용한 교집합, 합집합, 차집합 구하기 - 각 집합마다 2개의 함수가 있는데, 둘 다 결과는 같음으로 더 편한 함수를 사용하면 된다.
    s1 = set([1,2,3,4,5,6])
    s2 = set([4,5,6,7,8,9])
    
    #교집합 - 서로 겹치는 요소 출력
    s1 & s2
    s1.intersection(s2)
    >> {4,5,6}
    
    #합집합 - 두개의 집합을 합침
    s1|s2
    s1.union(s2)
    >>{1,2,3,4,5,6,7,8,0} #set는 요소가 서로 겹치면 자동으로 1개로 줄여줌
    
    #차집합 - 하나의 집합 빼기 다른 집합
    s1-s2
    s1.difference(s2)
    >>{1,2,3}​
  • 집합 자료형 관련 함수들 - add(값 1개만 추가), update(여러 개의 값 추가, 1개도 가능), remove(특정값 제거)
    #example of add
    s1 = set([1,2,3])
    s1.add(4)
    s1
    >> {1,2,3,4}
    
    #example of update
    s1 = set([1,2,3])
    s1.update([4,5,6])
    s1
    >> {1,2,3,4,5,6}
    
    #example of remove
    s1 = set({1,2,3})
    s1.remove(2)
    s1
    >> {1,3}​

자료형에도 참과 거짓이 존재한다. 보통 컴퓨터의 고전 언어를 생각하면 01010101000 이라는 이진법이 떠오를 것이다. 여기서 0은 거짓 1은 참이다. 문자열같은 경우는 "" 이런식으로 비어있으면 거짓, "Hi"라고 내용이 있으면 참이다. 리스트,튜플, 딕셔너리는 문자열과 같이 요소가 있으면 참이고, 비어있는 리스트는 거짓이다. 숫자형은 0 혹은 None이면 거짓이고 0이 아닌 다른 숫자는 모두 참이다.


내가 지금까지의 블로그를 작성하면서 우리는 변수를 사용해왔다. a = 1, name = 'Justin' 이런식으로 말이다. 변수를 쉽게 설명하자면 사람을 설명할 때 그 사람에 대해서 하나씩 하나씩 설명해주기 귀찮으니깐 변수를 입력을 하면 그 사람의 모든 설명이 다 나오는 매우 편리한 녀석이다. C언어나 Java같은 경우에는 변수의 자료형을 써줘야하는데, 파이썬은 그럴 필요가 없어서 사용자가 더 쉽게 배울 수 있는 큰 장점이 있다. 우리가 a = 3 이라고 할때, a는 변수의 이름이며 3은 정수형 객체가 저장된 메모리 위치를 가리킨다. 그걸 레퍼런스(Reference)라고도 부른다.

type(3) #type(x) x의 객체 종류를 알기위한 함수
>><class 'int'> #숫자 3은 정수형 객체라는 걸 증명한다.

a = 3
b = 3
a is b
>>True # a와 b는 같은 객체라는 것이 참이다.

위의 예를 보면 a는 3 이라는 객체의 메모리 주소를 가르키고 있다는 뜻이고, b도 3이라는 객체의 메모리 주소를 가르키고 있다는 뜻이다. 그래서 두 변수가 가르키는 메모리 주소가 동일함으로써, 참이라는 결과가 나오게 되는 것이다. 현재 3 이라는 객체의 메모리 주소를 가르키고 있다는 변수의 개수는 2개이다. 이거를 '레퍼런스 카운트' 라고 한다. 현재의 레퍼런스 카운트는 2이다. 또 다른 변수를 입력해 3을 가르킴연 레퍼런스 카운트도 3으로 증가한다. 변수들이 같은 객체를 향하고 있는지 확인하는 방법은 밑에와 같다. 

import sys #sys모듈 호출
sys.getrefcount(3)#3에 대한 레퍼런스 카운트 호출

변수 만드는 법 - 쓸모없는 거 같아도 엄청 중요하다

a,b =(1,2) #튜플로 a,b에 값 지정
a,b = 1,2 #튜플은 괄호가 필요없기때문에 이런식으로도 저장이된다.
[a,b] = [1,2] #리스트로 지정가능
a = b = 1 # a = 1 , b = 1

a=3
b=5
a,b = b,a #a는 b가되고, b는 a가 된다.
a = 5
b = 3

메모리에 생성된 변수를 없애려면 del(변수)함수를 사용하면 되는데, 이걸 사용하면 전에 설명했던 reference count도 1씩 줄어들게 된다. reference count가 0이 되는 순간 3이라는 객체는 메모리에서 사라지게된다. 이걸 Garbage Collection이라고 부른다.

a = 3
b = 3
del(a)
del(b)

리스트를 이용한 변수 복사 - 헷갈리지만 조금만 이해하면 쉽다.

a = [1,2,3]
b = a 
a[1]='Hi'
a = [1,'Hi',3]
b = [1,'Hi',3] #리스트만 복사한게 아니라, a라는 변수 자체를 복사했음으로, a가 바뀌면 b도 바뀜

#변수 말고 요소를 복사하고 싶을때
a = [4,5,6]
b = a[:]#리스트 전체호출
a[0] = 1
a == [1,5,6]
b == [4,5,6] #변수를 복사한게 아니라 리스트의 요소들만 복사했음으로써, a가 바뀌어도 b는 그대로

#copy모듈이용
from copy import copy
b = copy(a) #b = a[:]와 동일하다.