Python 데이터타입 (비시퀀스 : 딕셔너리, 세트)
기본적인 내용이 다 끝나간다. 조금만 더 힘내면 당신은 기초는 끝나가는 것이다!!
dictionary(딕셔너리)
: 키 - 값(key-value) 쌍으로 이루어진 자료형이며 간단하게 비유하자면 key는 상자를 열기위한 도구이며 value는 상자가 열렸을 때의 결과물이라고 생각하면 편할 것 같다.
또한 딕셔너리는 보기에는 순서가 있어보이지만 순서, 정렬이 되어있지 않은 Non-sequence 임에 명심하자.
이때, 조건이 있다.
key는 변경 불가한 데이터(immutable)만 가능하다. (문자열[str], 숫자 데이터[int, float], boolean, tuple, range 등)
value는 어떠한 형태여도 상관 없다.
key 를 dictionary에 넣으면 valuse 값이 튀어나온다. 그러한 key, value들을 넣어둔 것이 오른쪽 트럭과 같이 dictionary 인 것이다. 가장 어려웠던 데이터 타입이기 때문에.. 그림에도 공을 좀 들여보았다. { key1 : value1, key2 : value2 } 의 형태를 띄고 있으며 일반적인 데이터 타입들과 달리 틀을 지켜주어야만 한다.
Dictionary(딕셔너리) 생성
: 중괄호 ({ }) 혹은 dict( )을 통해 생성할 수 있다. 두개의 방식이 조금 다르기 때문에 잘 확인하고 기호를 잘 넣어주어야 한다. 사실 아직도 햇갈린다..ㅎㅎ ' { } ' or ' [ ] ', ' : ' or ' = ' 잘 확인하기!!
# 비어있는 dictionary 생성
dict_test_a = {}
dict_test_b = {}
print(type(dict_test_a))# <class 'dict'>
print(type(dict_test_b))# <class 'dict'>
# 비어있는 dictionary 없이 바로 틀만 지키면 할당 가능하다.
dict_test_a = {'a':'apple', 'b':'banana', 'c':'cake'}
print(dict_test_a) # {'a': 'apple', 'b': 'banana', 'c': 'cake'}
dict_test_b = {'d':'dollar', 'e':'egg', 'dict_in_list':[2024, 1, 2]}
print(dict_test_b) # {'d': 'dollar', 'e': 'egg', 'dict_in_list': [2024, 1, 2]}
# dict()를 통한 생성. 위의 형태랑 다르기 때문에 잘 구분해줘야 한다.
dict_test_c = dict(f = 'free', g = 'garden', h = 'high')
print(type(dict_test_c))# <class 'dict'>
print(dict_test_c) # {'f': 'free', 'g': 'garden', 'h': 'high'}
Dictionary(딕셔너리) 접근
: 접근하는 방식은 key를 사용한다. 이후에 method를 배우게 되면 다양하게 접근이 가능하다. 하지만 지금은 기본적인 것만 다루려고 한다.
# key를 통해 value 값을 가져오는 딕셔너리의 사용
my_dict = {'생일':'6월 24일','현재 년도':1996 , '지역':['서울', '구미', 291]}
print(my_dict) #{'생일':'6월 24일','현재 년도':1996 , '지역':['서울', '구미', 291]}
print(my_dict['생일']) # 6월 24일
print(my_dict['현재 년도']) # 1996
print(my_dict['지역']) # ['서울', '구미', 291]
# 또한 value 값을 변경할 수 있다. dict[key] = value
my_dict['현재 년도'] = 2024
print(my_dict) # {'생일': '6월 24일', '현재 년도': 2024, '지역': ['서울', '구미', 291]}
# key 안의 value의 list에 접근하기
print(my_dict['지역'][1]) # 구미
# key 안의 value의 list의 값을 변경할 수 있다.
my_dict['지역'][1] = '대구'
print(my_dict) # {'생일': '6월 24일', '현재 년도': 2024, '지역': ['서울', '대구', 291]}
적어도 딕셔너리에 접근하여 value를 가져오는 방법과 값을 변경하는 방법 두가지는 정확하게 알아야 한다. list의 값을 변경 할 수 있었던 것은 dict는 non-sequence지만, list가 sequence 데이터이기 때문이다.
또한, 중복이 불가하다. 오류가 나진 않고 하나로 합쳐지는데, 규칙이 있다.
# dictionary에 key 중복이 들어간다면?
my_dict = {'a':'a', 'b':'b', 'a':'내가 진짜', 'c':'b'}
print(my_dict) # {'a': '내가 진짜', 'b': 'b', 'c': 'b'} value는 중복이어도 상관없다.
# 그럼 key 중복중 random으로 value가 튀어나올까?
my_dict = {'a':'a', 'b':'b', 'a':'내가 진짜', 'c':'b', 'a':'아니야 내가 진짜야'}
print(my_dict) # {'a': '아니야 내가 진짜야', 'b': 'b', 'c': 'b'} 마지막 요소 기준으로 출력된다.
중복이 없는거면 하나로 합쳐지는 것도 랜덤이어야 하는 것이 아닌가? 다른 key:value의 값이 나올까 여러번 출력 해보아도 dict 속 제일 마지막에 속하는 key:value값만 튀어나오게 된다. 이에 대한 이유는 중복을 허가하지 않기 때문에 마지막으로 입력된 value로 덮어 씌워진다.
set (세트)
: 순서와 중복이 없는 변경 가능한 데이터. 앞선 내용인 순서와 중복이 없다는 것은 dict와 동일하나, 다른점은 변경 가능하다라는 것이다. 과거 중학교 들어가면 배우던 집합과 같다. 이후에 method에서 배우는 것도 합집합, 차집합, 교집합 등 동일한 것을 배우게 된다.
set(세트) 생성
: 표기는 { } 으로 dict와 동일한 기호를 갖는다. 다만 차이점이 있다면 set() 자체가 함수이다.
# 잘못된 빈 set를 생성하는 법
set_test = {}
print(set_test) # {}
print(type(set_test)) # <class 'dict'> dict의 생성 방법과 같기 때문에 잘못된 생성 방법
# 제대로 된 빈 set를 생성하는 법
set_test = set() # 반드시 set()를 통해 비어있는 set 할당
print(set_test) # set()
print(type(set_test)) # <class 'set'> 제대로 된 set가 생성되었음을 알 수 있음
# {}을 통해 set를 생성하는 법
set_test = {1, 3, '나는 집합'}
print(set_test) # {1, 3, '나는 집합'}
print(type(set_test)) # <class 'set'>
잘못된 빈 set를 생성하는 것만 조심하면 된다. set가 유용하게 쓰일 때가 있는데, list속에 중복된 요소를 제거하는대에도 쓰일 수 있다. 방법은 list -> set -> list 인데, 이렇게 되면 순서는 섞이게 된다.
# set을 통해 두 list의 중복된 요소를 제거하는 방법
list_a = [1, 2, 'a', 3, 2, 5, 4, 6]
list_b = [100, 5, 'a', 9, 10, 11, 3]
plus_list = list_a + list_b
new_set = set(plus_list)
new_list = list(new_set)
# 이때, a와 b리스트의 중복을 b에서 지우고, 숫자열이 먼저 이후 문자열이 나열되는 규칙은 있다.
print(new_list) # [1, 2, 3, 4, 5, 6, 100, 9, 10, 11, 'a']
앞서 언급한 세트의 집합 연산의 기호들이 있지만, 나중에 method하면서 한번에 다룰예정이므로 생략하겠다.