본문 바로가기

Programming languages/Python

3. Data Type(Dictionary & Set)

728x90
반응형

<Dictionary>

 

Dictionary가 뭘까?

Dictionary는 사전을 의미한다.

우리가 보통 사용하는 한영사전은 한국어로는 뜻을 알지만 영어로 어떻게 표현하는지 모를 때 찾아본다.

'사람'이 영어로 무엇인지 궁금하면 우리는 사전에서 '사람' 을 찾는다.

'사람'이라는 데이터를 찾으면 거기에 영어로 'People'이라고 적혀 있을 것이다.

파이썬도 이와 비슷하다. Key값과 Value 값은 서로 대응 되는 값이다. 이를 연관 배열 또는 Hash라고도 한다.

위의 경우는 {Key:Value} 가 {'사람':'People'} 이렇게 대응될 것이다. 

이러한 구조의 장점은 리스트나 튜플은 순차적으로 해당 요소값을 구하는 것에 비해 Key값만 찾아서 Value 값을 불러오면 된다는 강점이 있다. 바로 예시로 가보겠다.

 

d1 = {'name':'BanApp', 'age':25, 'place':['geek_inside','home'],
      'score':4.5, 'grade':'A'} #딕셔너리 생성

print(d1) #딕셔너리 출력

d1['weight'] = 65 #딕셔너리 추가
print(d1)

print(d1['name']) #딕셔너리에서 'name' key값으로 value 값 호출

del(d1['place'][1]) #딕셔너리 'place' key 값으로 리스트 호출 거기서 [1] 삭제

print(d1)

위의 코드를 보면 대충 어떤 느낌인지 감이 온다. 딕셔너리 추가 방법은 Key값으로 이름 지어진 배열에 Value 값을 넣는다고 이해하면 좋을 것 같다. del()의 경우도 단순한 Value값뿐만 아니라 리스트로 이루어진 Value 값에도 접근이 가능한 걸 확인할 수 있다.

딕셔너리를 만들때는 Value 값이 중복되는 경우는 있어도 Key값이 겹치는 경우는 없도록 하는 것이 좋다. 말 그대로 Key값은 고유한 값을 상정하기 때문이다.

 

d1 = {'name':'BanApp', 'age':25, 'place':['geek_inside','home'],
      'score':4.5, 'grade':'A'}

print(d1.keys()) #d1의 Key 값들만 출력

print(d1.values()) #d1의 Value 값들만 출력

print(list(d1.keys())) #list 형식으로 Key값들을 출력

print(d1.items()) # Key : Value 쌍 호출

print(d1.get('age')) #get함수를 이용해 value 값 출력
print(d1.get('height')) #get 함수를 이용해서 존재하지 않는 Key값 호출시 오류가 아닌 none(False) 반환
#print(d1['height']) #존재하지 않는 Key값 호출로 오류 발생
print(d1.get('height','Secret')) #Key값 존재하지 않을때 기본값 반환하게 설정 가능

print('name' in d1) #Key값이 Dictionary 안에 존재하는지 True or False로 반환해준다.


print(d1.clear()) #Dictionary를 초기화 해준다.

위의 실행 결과는 다음과 같다.

 

dict_keys(['name', 'age', 'place', 'score', 'grade'])
dict_values(['BanApp', 25, ['geek_inside', 'home'], 4.5, 'A'])
['name', 'age', 'place', 'score', 'grade']
dict_items([('name', 'BanApp'), ('age', 25), ('place', ['geek_inside', 'home']), ('score', 4.5), ('grade', 'A')])
25
None
Secret
True
None

 

위에 부터 보면 dict_keys는 Dictionary안의 값들을 요소 값으로 반환해 주고 있다. 그러나 3번째 결과물은 list형으로 반환해 주고 있다.

최신 파이썬에서는 기본적으로 메모리 낭비를 줄이기 위해 요소값으로 반환해주고 있다고 한다. 만약 list 형으로 자료가 필요한 경우 위처럼 list형으로 형 변환을 시켜 주도록 하자.

.get() 함수의 경우 d1[' '] 이런 식으로 접근하는 것보다 이점이 더 많다. 존재하지 않는 Key 값일 때 오류를 뿜지 않고 거짓을 반환해 준다.

또한 존재하지 않을경우 기본값(Default)을 반환하도록 직접 설정해 줄 수 있다는 점이다. 

' key' in Dictionary 같은 경우 해당 key값이 사전 안에 존재하는지 검색해 주는 기능이다. 조건문에서 쓰기 좋은 기능이 아닐까 싶다. 

 

<Set>

 

Set은 뭘까?

Set은 집합을 의미한다. 필자는 중1 1학기 수학 과목의 첫 단원이 집합이였던 시대의 사람이다. 당시 집합을 굉장히 어려워 했다.

그런류의 수학적 접근과 직관을 잘 받아들지 못했던것 같은데 어느순간 이과적인 수학적 직관(?)을 받아들이게 된 후로 수학에서 큰 어려움을 겪었던 적은 없었던것 같다. 집합은 자료의 모음이다. 파이썬에서 집합이 어떻게 표현되는지는 이제부터 알아보자.

 

s1 = set([3,5,2,4,1,3,5]) #정수 요소를 포함한 집합 생성
s2 = set("Hello") #문자열을 포함한 집합생성
s3 = set() #빈 집합 생성

print(s1) #오름차순 정렬 됨 & 중복제거
print(s2) #무작위 & 중복 제거
print(s3) #빈 집합 출력
#print(s1[2]) #집합형은 인덱싱 & 슬라이싱 불가능하므로 오류

l1 = list(s1) #s1을 리스트로 변환
l2 = list(s2) #s2를 리스트로 변환
print(l1[1]) #정렬된 s1의 [1]공간에 있는 2 출력
print(l2[3]) #문자열이 무작위로 바뀌므로 그때그때 값이 달라짐
print(l2[0:]) #문자열 list 형으로 형변환 그러나 중복된 문자는 중복제거 & 순서 무작위

위의 결과는 다음과 같다.

{1, 2, 3, 4, 5}
{'l', 'o', 'e', 'H'} or {'H', 'l', 'e', 'o'} 등등..
set()
2
H or o  등등...
['l', 'o', 'e', 'H'] or ['H', 'l', 'e', 'o'] 등등...

 

집합은 set()을 이용해서 만들 수 있다. 집합의 특징에는 '중복을 허용하지 않는다', '순서가 없다' 가 있다. 따라서 집합은 일반적으로 인덱싱으로 접근을 지원하지 않는다. 따라서 집합을 List나 Tuple로 바꿔 주어여 한다. 그러나 문자열은 List로 바꿔줘도 set()의 기본성질인 무작위 순서와 중복된 요소를 제거되는것이 적용된다. 슬라이싱이나 인덱싱으로 접근이 가능하다 정도의 의미만 있다.

정수형 같은 숫자 자료들은 자동으로 중복제거 후 오름 차순으로 정리 되는것 같다. 그러나 정수형 데이터만 가진 set()도 list나 Tuple로 형 변환을 해야만 인덱싱이나 슬라이싱이 가능한 것을 볼 수 있다.

 

s1 = set([1,2,3,4,5,6])
s2 = set([5,6,7,8,9,10])

print(s1&s2) #s1 과 s2의 교집합
print(s1.intersection(s2)) #s1과 s2의 교집합

print(s1|s2) #s1과 s2의 합집합
print(s1.union(s2)) #s1과 s2의 합집합

print(s1 - s2) #s1 - s2 차집합
print(s1.difference(s2)) #s1 - s2 차집합

print(s2 - s1) #s2 - s1 차집합
print(s2.difference(s1)) #s2 - s1

s1.add(7) #s1에 요소 한개 추가
print(s1)

s2.update([11,12,13]) #s2에 요소 여러개 추가
print(s2)

s1.remove(2) #s1에서 '2' 라는 요소 제거
print(s1)

  위의 결과는 다음과 같다.

 

{5, 6}
{5, 6}
{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
{1, 2, 3, 4}
{1, 2, 3, 4}
{8, 9, 10, 7}
{8, 9, 10, 7}
{1, 2, 3, 4, 5, 6, 7}
{5, 6, 7, 8, 9, 10, 11, 12, 13}
{1, 3, 4, 5, 6, 7}

 

앞의 리스트, 튜플, 딕셔너리 자료형의 추가, 삭제 방법과 비슷하다.

차집합 정도를 잘 봐두면 좋을 것 같다.

728x90
반응형

'Programming languages > Python' 카테고리의 다른 글

Examples) Chapter 1&2  (0) 2021.12.07
4. Data Type(Bool & Variable)  (0) 2021.12.07
2. Data Type(List & Tuple)  (0) 2021.12.06
1. Basic & Data Type(Number, String)  (0) 2021.12.06
Let me know about "Python"  (0) 2021.12.06