
Python 3.10.2
conda 24.9.0
JupyterLab 4.2.5
컬렉션 자료형의 마지막 부분인 set,과 dictionary다.
다시 정리하자면 다음과 같다.
컬렉션 자료형
순서형: str(문자열), list(리스트), tuple(튜플)
비순서: set(수학집합), dictonary(사전형태)
set과 dictionary는 비순서이다. 그렇다면 순서형과 어떤식으로 다른지를 잘 파악하자.
그리고 사실 set는 거의 사용하지 않는다. 따라서 딕셔너리에 대해 조금 자세히 알아보고 set는 상당 생략할 수 있다.
딕셔너리(dictionary)는 대응 관계를 나타내는 자료형이다.
key와 value를 한 쌍으로 갖는 자료형으로 순차적으로 들어가지 않고, key를 통해 value를 얻는다.
이때 { }의 중괄호를 사용하며, value값으로 리스트, 튜플과 같은 형태가 들어갈 수도 있다.
딕셔너리는 특징을 잘 알아야 한다.
다른 언어에서도 굉장히 많이 쓴다.
리스트를 기준으로 설명하면,
lst=[1,2,3,4,5] 이런식으로 들어갈때, 5의 데이터를 가져오고 싶다면
a[0]부터 찾고 a[1]찾고, 이런식으로 순서대로 찾는다.
print(a[4])는 직관적으로 a[4]를 찾아내는 것이 아니라, 순서대로 쭉 찾아내는 것이다.
그런데 만약 데이터가 5000개가 있고 원하는 데이터가 4500번에 있다면?
처음부터 찾으려면 너무 오래걸린다.
그런데 딕셔너리(dictonary)는 비 순서형이다.
데이터는 key와 value 값의 쌍을 가지고 들어간다.
따라서 찾을때 key값으로 찾으면 된다. 즉 탐색 속도가 빠르다!
머신러닝이나 딥러닝에서 그렇게 많이 쓰지는 않는데,
다른 언어에서는 정말 많이 사용한다.
예를들어 웹을 기준으로 설명하자면, 하나의 오라클로 입력할 수 있는 필드를 만들고 하나씩 오라클로 입력해주기도 한다.
하지만 파이썬은 그렇지 않고, 하나하나씩 넣을 필요가 없다.
# 선언
dic={"name":"홍길동", "phone":"010-1234-5678", "birth":"1900-01-01"}
print(dic, type(dic))
# key 값을 이용한 탐색
print(dic["name"])
# ✅ 출력 결과
# {'name': '홍길동', 'phone': '010-1234-5678', 'birth': '1900-01-01'} <class 'dict'>
# 홍길동
.append() 등의 메서드로 추가 및 수정을 하지 않고, 키 값을 사용한다.dic["addr"]="서울 서초구" # 추가
dic["phone"]="010-1111-1111" # 수정
print(dic)
del dic["addr"] # 삭제
print(dic)
dic2={"name":"julian", "score":[10,20,30], "num":(1,2,3,4,5)}
print(dic2)
my_list=dic2["score"]
print(my_list)
print(my_list[0])
my_tuple=dic2["num"]
print(my_tuple)
a, b, c, d, e = my_tuple
print(a)
print(my_tuple[0])
✅ 출력 결과
# {'name': '홍길동', 'phone': '010-1111-1111', 'birth': '1900-01-01', 'addr': '서울 서초구'}
# {'name': '홍길동', 'phone': '010-1111-1111', 'birth': '1900-01-01'}
# {'name': 'julian', 'score': [10, 20, 30], 'num': (1, 2, 3, 4, 5)}
# [10, 20, 30]
# 10
# (1, 2, 3, 4, 5)
# 1
# 1
# 검색
print("key 검색:", dic.get("name")) # key에 해당하는 value를 반환하는 함수
print(dic["name"]) # 또는 dic["name"]
# 반환 메서드 및 형 변환
print("key 전체 출력:", dic.keys()) # key 목록을 반환하는 함수
print("value 전체 출력:", dic.values()) # value 목록을 반환하는 함수
print("key와 value 전체 출력:", dic.items()) # key, value 목록을 반환하는 함수
✅ 출력 결과
# key 검색: 홍길동
# 홍길동
# key 전체 출력: dict_keys(['name', 'phone', 'birth'])
# value 전체 출력: dict_values(['홍길동', '010-1111-1111', '1900-01-01'])
# key와 value 전체 출력: dict_items([('name', '홍길동'), ('phone', '010-1111-1111'), ('birth', '1900-01-01')])
⭐ 그런데 이 들의 데이터 타입을 확인하면 새로운 dict_로 시작하는 타입들이 존재하는 것을 볼 수 있다.
print(type(dic.keys())) print(type(dic.values())) print(type(dic.items())) # ✅ 출력 결과 # <class 'dict_keys'> # <class 'dict_values'> # <class 'dict_items'>따라서 이 각각 dict_keys, dict_values와 같은 데이터 타입에서
key값과 value 값을 뽑으려면 list로 형을 변환하여 뽑아야 한다.
왜냐하면 그냥 dict 객체는 값을 뽑을 수 없기 때문이다.key=list(dic.keys()) print(key) print(key[0]) print(type(key)) # ✅ 출력 결과 # ['name', 'phone', 'birth'] # name # <class 'list'>이렇게 list로 변환된 것을 확인할 수 있다.
values()도 마찬가지다.value=list(dic.values()) print(value, type(value)) # ✅ 출력 결과 # ['홍길동', '010-1111-1111', '1900-01-01'] <class 'list'>그리고
items()도 마찬가지인데,items()는 잘 알아야 하는 부분이 있다.items=list(dic.items()) print(items, type(items)) # ✅ 출력 결과 # [('name', '홍길동'), ('phone', '010-1111-1111'), ('birth', '1900-01-01')] <class 'list'>items의 경우에는 list로 형변환을 하고 나면 다시 그
[ ]의 list 안에 각 요소가( )의 tuple로 각각 들어있음을 볼 수 있다.
그렇기 때문에 또 다시 key와 value를 뽑으려면 인덱스로 접근해서 한번 더 list로 형변환을 해주어야 한다.item=list(items[0]) print(item, type(item)) print(item[0]) print(item[1]) # ✅ 출력 결과 # ['name', '홍길동'] <class 'list'> # name # 홍길동이렇게 변환하여 사용해야 한다.
# clear(): 딕셔너리 내의 모든 요소 삭제
dic.clear()
print(dic)
# ✅ 출력 결과
# {}
# update(): 두 개의 딕셔너리를 병합하는 함수 / + 연산자 같은거
a={"name":"홍길동", "age":21}
b={"birth":"1900-01-01"}
a.update(b)
print(a)
# ✅ 출력 결과
# {'name': '홍길동', 'age': 21, 'birth': '1900-01-01'}
굳이 이렇게 a와 b를 결합할 필요는 없지만 dictionary가 아니더라도 데이터들을 병합하는 경우가 있기 때문에 알아두자.
예를들어 날씨에 기준한 배춧값 예측한다고 할 때,
기상청 데이터와 배춧값 데이터를 얻어와서 날짜를 기준으로 join하는 이런 경우를 말한다.
# in/not in: 해당 데이터에 값이 있는지 확인해봐야 하는 경우
print("name" in a)
print("age" not in a)
# ✅ 출력 결과
# True
# False
set는 비 순서형이다!
순서가 없으며, 순서가 없기 때문에 인덱싱도 불가능하다.
set 자료형에 저장된 값을 인덱싱으로 접근하려면 다음과 같이 리스트나 튜플로 변환한 후 접근해야한다.
또한 중복이 불가능하다.
a={"A","B","C","D","E"}
print(a, type(a))
# ✅ 출력 결과
# {'A', 'C', 'E', 'D', 'B'} <class 'set'>
결과를 보면 비순서형이기 때문에 순서대로 입력되지 않고 순서가 뒤죽박죽임을 알 수 있다.
그리고 이렇게 쓰면 딕셔너리와 조금 헷갈릴 수 있기 때문에 또 다른 선언 방법이 있다.
aa=set({1,2,3,4}) # 정수형
print(aa, type(aa))
# ✅ 출력 결과
# {1, 2, 3, 4} <class 'set'>
또 set()를 이용하여 set를 선언할 수 있는데, 이에 list, str, tuple을 입력하여 생성할 수 있다.
b=set(["A","B","C"])
print(b, type(b))
c=set(("A","B","C"))
print(c, type(c))
# ✅ 출력 결과
# {'A', 'C', 'B'} <class 'set'>
# {'A', 'C', 'B'} <class 'set'>
# a.add(): set 추가 method
a.add("F")
print(a)
# a.remove(): set 삭제 method
a.remove("A")
print(a)
# a.update(): set 병합 method
# set는 중복을 허용하지 않는다. 따라서 하나씩만 저장된다.
# `a={"A","B","C","D","E"}`와 `b=set(["A","B","C"])`
a.update(b)
print(a)
✅ 출력 결과
# {'A', 'C', 'F', 'E', 'D', 'B'}
# {'C', 'F', 'E', 'D', 'B'}
# {'A', 'C', 'F', 'E', 'D', 'B'}
a={'A', 'C', 'F', 'E', 'D', 'B'} 를 이용해서 해보자. my_list=list(a)
print(my_list)
print(my_list[0])
# ✅ 출력 결과
# ['A', 'C', 'F', 'E', 'D', 'B']
# A
Q1. 오류를 발생한 코드를 찾고 고쳐라.
원하는 출력값:
{'name': '신짱구', 'phone': '010-1234-5678', 'birth': '1900-01-01', 'address': '서울 서초구'}
1) dic = {"name": "홍길동", "phone": "010-1234-5678", "birth": "1900-01-01"}
2) dic["name"] = "신짱구"
3) print(dic["address"])
4) print(dic)
A1. 3) adress가 없기 때문에 에러가 발생한다. 따라서 dic["address"] = "서울 서초구"로 수정해야 한다.
Q2. 오류를 발생한 코드를 찾고 고쳐라.
원하는 출력값:
2
1) setset = set([1, 2, 3, 4])
2) print(setset.get(2))
A2. 2) set은 get()을 지원하지 않는다. 따라서 2를 출력하고자 한다면
if 2 in setset:
print(2)
와 같이 바꿔야 한다.
Q3. 오류를 발생한 코드를 찾고 고쳐라.
원하는 출력값:
{"name": "홍길동", "phone": "010-1234-5678", "address": "서울 서초구", "birth": "1900-01-01"}
1) dic_a = {"name": "홍길동", "phone": "010-1234-5678"}
2) dic_b = {"address": "서울 서초구", "birth": "1900-01-01"}
3) dic_a + dic_b
4) print(dic_a)
A3. 3) update() 메서드를 사용하여 병합해야 하므로, dic_a.update(dic_b)로 수정해야 한다.