본문 바로가기
학부 생활 + 랩실/Python

파이썬(4) - 컨테이너(2) 딕셔너리, 튜플

by 프롭 2026. 4. 3.
딕셔너리(Dictionary)

단순히 자료를 나열하는 리스트로는 충분하지 않을 때가 있다. 리스트는 같은 속성의 자료를 여러개 가지고 있을 때 유용하지만 다른 속성의 자료가 들어가면 읽기 힘들어진다.

다음 코드와 같이 리스트를 저장한다해보자

pooh = ["bear", 5, 50]
tigger = ["tiger", 4, 40]

위와 같이 자료를 저장하면 순서를 똑같이 맞추지 못 할 경우 잘못된 결과가 나오기 쉽고 코드만 봐서는 왜 0이 종이고 1이 나이인지 알 수 없다.

 

이러한 대응 관계를 명시적으로 보여줄 수 있는 자료구조가 딕셔너리(Dictionary)다. 딕셔너리는 키(Key)를 입력하면 그에 해당하는 값(Value)를 출력해주는 자료 구조다. 딕셔너리는 {}(barce)로 만드며 :(conlon)을 사이에 두고 앞에 Key 값을 쓰고 뒤에 Value 값을 쓴다. 여러개의 키:값 쌍은 쉼표로 구분한다. 값을 꺼낼때는 리스트처럼 []를 쓰지만 리스트는 인덱스 숫자를 입력하고 딕셔너리는 Key 값을 입력한다.

 

위에 리스트를 예제를 다시 써보자. 코드는 더욱 길어지지만 코드를 명시적으로 이해할 수 있다는 큰 장점이 있다.

pooh = {"species": "bear", "age": 5, "weight": 50}
tigger = {"species": "tiger", "age": 4, "weight": 40}
print("pooh's species is", pooh["species"])
print("pooh's weight is", pooh["weight"])
print("tigers's age is", tigger["age"])

출력 :

pooh's species is bear

pooh's weight is 50

tigers's age is 4

 

딕셔너리를 만들 때 Value에는 어떤 객체가 들어가도 상관없다. 리스트나 또 다른 딕셔너리가 들어가도 된다. 하지만 Key는 숫자나 문자열을 써야한다. 딕셔너리는 Key로 들어온 값을 hash() 함수를 통해 hash를 생성하고 이를 기록해 두었다가 특정 키를 찾을 때 활용한다. hash로 변환해서 검색하기에 검색 속도가 빠르다. 이때 해시 함수에 기본 타입이 아닌 값이 들어가면 TypeError가 발생한다.

 

 

  • 기본 사용법

딕셔너리의 기본 특징은 순서가 없다는 것이다. 사실 딕셔너리는 오직 Key로만 Value에 접근할 수 있으니 순서가 상관이 없다.

pooh = {"species": "bear", "age": 5, "weight": 50}
# 데이터 읽기: 특정 `key`에 연결된 `Value`를 읽기 위해서는 `[Key]`하면 된다.
print("pooh's age is", pooh["age"])
# 데이터 수정: 특정 `key`에 연결된 `Value`를 수정할 때는 그냥 값을 키에 넣으면 된다.
pooh["age"] = 10
print("pooh's age is", pooh["age"])
# 데이터 추가: 이미 만들어진 딕셔너리에 `Key:Value` 쌍을 추가하는 방법 역시 그냥 값을 키에 넣으면 된다.
pooh["height"] = 1.2
print("pooh:", pooh)
# 데이터 삭제: 리스트처럼 `del`을 이용한다.
del pooh["weight"]
print("pooh:", pooh)

출력 :

pooh's age is 5

pooh's age is 10

pooh: {'species': 'bear', 'age': 10, 'weight': 50, 'height': 1.2}

pooh: {'species': 'bear', 'age': 10, 'height': 1.2}

 

만약 없는 Key를 입력하면 KeyError가 발생한다. 해당 키가 있는지 확신이 없을 때는 in 연산자를 통해 키의 존재 유무를 확인 후 쓸 수도 있다.

 

  • 관련 함수

딕셔너리를 사용하다보면 Key 혹은 Value만 따로 쓰고 싶을 때가 있다. 예를 들어 "이름":"점수" 형태로 만들었는데 명단만 필요하거나 점수만 필요한 경우가 있다. 혹은 이를 쌍(Tuple)으로 받고 싶을 수도 있다.

scores = {"pooh": 80, "tigger": 70, "piglet": 90, "rabbit": 85}
print("names:", scores.keys()) # Key 값
print("scores:", scores.values()) # Value 값
print("items:", scores.items()) # 쌍

출력 :

names: dict_keys(['pooh', 'tigger', 'piglet', 'rabbit'])

scores: dict_values([80, 70, 90, 85])

items: dict_items([('pooh', 80), ('tigger', 70), ('piglet', 90), ('rabbit', 85)])

 

위 출력은 리스트처럼 보이지만 dict_keys, dict_values, dict_items라는 다른 데이터 형식이다. 이들을 list()로 감싸면 쉽게 리스트로 변경 가능하다.

scores = {"pooh": 80, "tigger": 70, "piglet": 90, "rabbit": 85}
print("names:", list(scores.keys()))
print("scores:", list(scores.values()))
print("items:", list(scores.items()))

출력 :

names: ['pooh', 'tigger', 'piglet', 'rabbit']

scores: [80, 70, 90, 85]

items: [('pooh', 80), ('tigger', 70), ('piglet', 90), ('rabbit', 85)]

 

튜플(Tuple)

튜플은 한 마디로 쉽게 정리하면 수정 불가능한 리스트다. 튜플은 ()(parenthesis)로 만든다. 혹은 ()를 생략해도 된다. 튜플은 생성만 할 뿐 원소를 추가, 삭제, 수정할 수 없다. 생성된 튜플은 읽기만 가능한데 리스트와 동일하게 인덱싱과 슬라이싱을 통해 읽을 수 있다.

empty_tuple1 = ()
empty_tuple2 = tuple()
basic_tuple1 = ("Hello", 1234, 1.234, True)
basic_tuple2 = "Hello", 1234, 1.234, True
depth2_tuple = ("Hello", 1234, (1.234, True))
print("tuple1", basic_tuple1[0])
print("tuple1", basic_tuple1[2:])
print("tuple2", basic_tuple2[1])
print("tuple3", depth2_tuple[2][0])

출력 :

tuple1 Hello

tuple1 (1.234, True)

tuple2 1234

tuple3 1.234

 

튜플은 여러 값을 하나에 담았다가 다시 여러 변수에 나눠줄 수 있어 경우에 따라 유용하다.(패킹, 언패킹)

pooh = "pooh", "bear", 5, 50 # 패킹
name, species, age, weight = pooh # 언패킹
print("tupled pooh info:", name, species, age, weight)

출력 : tupled pooh info: pooh bear 5 50