1-1) Dictionary
● 사전자료형은 dict으로 표현되며 dictionary의 준말이다.
● key:value형식을 띄며, key:value의 한쌍이 사전을 이루는 한 원소이다.
● 리스트는 대괄호, 튜플은 소괄호였다면 사전과 집합은 중괄호로 원소들을 감싼다.
*key의 경우 자료형의 제약을 받는다. 바로 Hashable해야 한다.
Hashable: 해시함수에 넣어 해시값으로 변환할 수 있다는 것을 의미
따라서 hash는 어떠한 특정 값에 대해서 유일한 값을 가져야 한다.
사전 자료형의 key값은 hashable해야하고 추후 수정, 변경을 하지 못하게 immutable한 자료형으로 존재해야 한다.
따라서 key값으로 immutable한 튜플은 가능하지만 mutable한 리스트는 불가능하다.
tmp = {"name":9} ## 딕셔너리 생성
tmp["jisung"] = "Yoo" ## 딕셔너리에 key_value쌍 추가
## tmp => {"name":9, "jisung":"Yoo"}
del tmp["jisung"]
## del: 삭제(key값으로 조회, key값은 중복될 수 없으므로)
Age_dict = {"Nubzuki": 9} # 딕셔너리 객체 생성
Age_dict['Yonghyun'] = 25 # 딕셔너리에 key-value 쌍 추가
print(Age_dict)
del Age_dict['Yonghyun'] # 특정 key 값에 해당되는 원소 제거
print(Age_dict)
Age_dict['Nubzuki'] = 10 # 이전 value 값인 9가 10으로 수정
print(Age_dict)
Age_dict = {"Nubzuki": 8, "Nubzuki": 9, "Nubzuki": 10}
print(Age_dict)
1-2) Dictionary와 관련된 여러 메소드
1. keys: 딕셔너리 객체의 key값들을 모아 의사 리스트형태로 만듦
2. values: value값들을 모아 의사 리스트 형태로 만듦
3. items: key-value쌍들을 모아 의사 리스트 형태로 만듦
4. get: 특정값이 딕셔너리의 key값으로 존재하면 대응되는 value를 출력, 없으면 두번째 파라미터의 값을 반환
*의사 리스트: 리스트와 비슷한 형식
메소드의 반환값으로 나온 의사 리스트를 리스트로 다루고 싶으면 list(dic.keys())를 하면 된다.
Age_dict = {"Nubzuki": 9, "Yonghyun": 25, "KAIST": 52}
print(Age_dict.keys()) # 딕셔너리 객체의 key 값들을 모아 의사 리스트 형태로 만듦 (리스트는 아님)
print(Age_dict.values()) # value 값들을 모아 의사 리스트 형태로 만듦
print(Age_dict.items()) # 원소(key-value 쌍)들을 모아 의사 리스트 형태로 만듦
print(Age_dict.get("Yonghyun", "No key")) # 특정 값이 딕셔너리의 key값으로 존재하면 대응되는 value를 출력, 없으면 두번째 파라미터의 값을 내뱉음 (디폴트값은 None)
print(Age_dict.get("Santa Claus", "No key"))
print("Yonghyun" in Age_dict) # 특정 값이 딕셔너리의 key값으로 존재하는가
print("Santa Claus" in Age_dict)
1-3) 사전 자료형의 병합
tmp1, tmp2의 딕셔너리가 있다면
1. tmp = {**tmp1,**tmp2}
2. tmp1.update(tmp2)
위의 두가지 방식으로 딕셔너리를 합칠 수 있다.
2-1) Set
set: 동일한 원소를 중복하여 가지고 있을 수 없고 해당 원소들은 특정한 순서를 띄지 않는다는 것을 그대로 반영한다.
딕셔너리와 동일하게 중괄호로 원소를 묶지만 딕셔너리와 다르게 단일 값들을 가진다.
ex) my_first_set = {"Hello"}
2-2) set자료형의 메소드
set1.add(num): 집합에 원소 추가
set2.update(num1,num2): 집합에 원소 여러개 추가
set1.remove(num1): 집합에 원소 한개 제거
hello_set = {"Hello"} # 집합 객체 초기화
hello2_set = set("Hello") # 문자열의 각 문자를 집합의 원소로 간주
print(hello_set)
print(hello2_set) # 집합 내 원소의 unordered 특성 (순서가 없음)
hello2_set.add("d") # add: 집합에 원소 한개 추가
print(hello2_set)
hello2_set.update("e", "f") # update: 원소 여러개 추가
print(hello2_set)
hello2_set.remove("l") # remove: 원소 한개 제거
print(hello2_set)
2-3) 수학적 기능
집합이라고 하면 중, 고등학교 수학에서 집합을 배웠던 것이 생각날 것이다.
교집합, 합집합, 차집합, 대칭차집합 연산을 모두 내장함수로 제공하고 있다.
1. intersection(교집합): & 혹은 intersection메소드 사용
2. Union(합집합): | 혹은 union메소드 사용
3. difference(차집합): - 혹은 difference메소드 사용
4. symmetric difference(대칭차집합): ^ 혹은 symmetric_difference메소드 사용
set1 = set([1, 2, 3, 4, 5.0]) # 리스트 객체의 형변환
set2 = set([3, 4, 5.0, 5, 6, "7"])
print(set2) # 집합에서는 수학적으로 값이 같으면 동일 원소로 간주
print(set1 & set2) # 교집합 - 연산자
print(set1.intersection(set2)) # 교집합 - 메소드
print(set1 | set2) # 합집합 - 연산자
print(set1.union(set2)) # 합집합 - 메소드
set1 = set([1, 2, 3, 4, 5.0]) # 리스트 객체의 형변환
set2 = set([3, 4, 5.0, 5, 6, "7"])
print(set1 - set2) # 차집합 - 연산자 (1)
print(set2 - set1) # 차집합 - 연산자 (2)
print(set1.difference(set2)) # 차집합 - 메소드 (1)
print(set2.difference(set1)) # 차집합 - 메소드 (2)
print(set1 ^ set2) # 대칭차집합 - 연산자
print(set1.symmetric_difference(set2)) # 대칭차집합 - 메소드
print((set1 | set2) - (set1 & set2)) # 대칭차집합을 다음과 같이도 표현할 수 있다.
3. 리스트, 튜플, 딕셔너리, 집합 간의 형 변환
딕셔너리는 리스트와 튜플로의 형 변환 중 value값을 손실하고 역으로 형 변환이 불가능하다.
my_set = {1, (2,), 3.0, "a"}
my_dict = {1: (2), 3.0: "a"}
my_tuple = tuple(my_set) # 집합 -> 튜플
my_list = list(my_set) # 집합 -> 리스트
print(my_tuple)
print(my_list)
my_tuple = tuple(my_dict) # 사전 -> 튜플
my_list = list(my_dict) # 사전 -> 리스트
print(my_tuple)
print(my_list)
my_set_2 = set(my_tuple) # 튜플 -> 집합
print(my_set_2)
my_dict_2 = dict(my_tuple) # 튜플 -> 사전 (불가능)
'💂군대 > KAIST ICT Academy' 카테고리의 다른 글
M10 - 클래스와 인스턴스 (3) | 2024.09.21 |
---|---|
MO9 - 문자열과 입출력 (7) | 2024.09.18 |
MO7 - 리스트와 튜플 (1) | 2024.09.12 |
MO6 - 함수 매개변수와 반환값 (0) | 2024.09.04 |
MO5 - 함수의 정의와 호출 (0) | 2024.08.21 |