[파이썬 핵심 기초 다지기] 컬렉션 자료형과 set, dictionary

julian·2025년 2월 14일

python

목록 보기
4/74
post-thumbnail

📌 사용 환경

Python 3.10.2
conda 24.9.0
JupyterLab 4.2.5


컬렉션 자료형의 마지막 부분인 set,과 dictionary다.
다시 정리하자면 다음과 같다.

컬렉션 자료형

순서형: str(문자열), list(리스트), tuple(튜플)
비순서: set(수학집합), dictonary(사전형태)

setdictionary비순서이다. 그렇다면 순서형과 어떤식으로 다른지를 잘 파악하자.

그리고 사실 set는 거의 사용하지 않는다. 따라서 딕셔너리에 대해 조금 자세히 알아보고 set는 상당 생략할 수 있다.


1. 딕셔너리(Dictonary)

  • key, value로 구성되어 탐색 속도가 빠르다.
  • 선언, 추가, 삭제, 수정
  • 서로 다른 자료형의 key-value
  • method
  • 병합

딕셔너리(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값으로 찾으면 된다. 즉 탐색 속도가 빠르다!

머신러닝이나 딥러닝에서 그렇게 많이 쓰지는 않는데,
다른 언어에서는 정말 많이 사용한다.
예를들어 웹을 기준으로 설명하자면, 하나의 오라클로 입력할 수 있는 필드를 만들고 하나씩 오라클로 입력해주기도 한다.

하지만 파이썬은 그렇지 않고, 하나하나씩 넣을 필요가 없다.

1.1. 코드

  • 딕셔너리는 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() 등의 메서드로 추가 및 수정을 하지 않고, 키 값을 사용한다.
    또 value값으로는 리스트, 튜플 등 서로 다른 컬렉션 자료형도 들어 갈 수 있다.
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
  • dictionary도 method를 가지고 있는데, 위 부분을 method를 이용해보자.
# 검색
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'}

굳이 이렇게 ab를 결합할 필요는 없지만 dictionary가 아니더라도 데이터들을 병합하는 경우가 있기 때문에 알아두자.
예를들어 날씨에 기준한 배춧값 예측한다고 할 때,
기상청 데이터와 배춧값 데이터를 얻어와서 날짜를 기준으로 join하는 이런 경우를 말한다.

# in/not in: 해당 데이터에 값이 있는지 확인해봐야 하는 경우
print("name" in a)
print("age" not in a)

# ✅ 출력 결과
# True
# False

2. set

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'>
  • set 메소드(Method)
# 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'}
  • set 요소 접근
    set의 요소를 모두 출력하려면 반복문을 돌려서 하나씩 뽑아와야 한다.
    그게 아니라면 list와 같은 것으로 변환시켜서 뽑아야 한다.
    물론 메모리를 그만큼 쓰기 때문에 좋은 방법은 아니다.
    반복문은 다음 포스팅에서 다룰 예정이니 이번에는 list로 변환해서 해보자.
    위에서 병합시킨 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)로 수정해야 한다.

profile
AI Model Developer

0개의 댓글