파이썬 자료구조 4가지 완벽 가이드 리스트 튜플 딕셔너리 집합 특징과 활용법

읽기 예상 시간: 9분

변수 여러 개를 하나로 묶어 관리하는 파이썬의 4가지 자료구조인 리스트, 튜플, 딕셔너리, 집합의 특징과 차이점을 명확히 정리해요. 상황별로 어떤 자료구조를 선택해야 하는지 완벽한 가이드를 제공하며, 입문자가 자주 겪는 리스트 참조 문제나 딕셔너리 키 제약 조건 등 실무에 바로 적용할 수 있는 꿀팁을 알려드려요.

목차

여러 개의 변수와 하나로 정리된 자료구조를 비교하는 모습

왜 자료구조가 필요한가요?

프로그래밍을 처음 배우면 변수 하나에 값 하나를 담는 방법을 가장 먼저 알게 돼요. 그런데 만약 학생 30명의 수학 점수를 저장해야 한다면 어떨까요? 변수를 30개 만드는 건 너무 비효율적이잖아요.

일반 변수를 여러 개 만드는 방식과 자료구조를 사용하는 방식을 비교해 볼게요.

python
# 일반 변수를 사용하면 코드가 끝없이 길어져요
score1 = 85
score2 = 92
score3 = 78
# ... 이렇게 30개를 만들어야 해요

# 리스트라는 자료구조를 쓰면 하나의 변수에 다 담을 수 있어요
scores = [85, 92, 78, 95, 88]

변수 수십 개를 만들 필요 없이 대괄호 하나로 깔끔하게 정리되었죠? 이렇게 여러 값을 하나의 변수에 묶어서 다루는 방법이 바로 자료구조예요. 파이썬에는 상황에 맞게 골라 쓸 수 있는 4가지 기본 자료구조가 있어요. 하나씩 차근차근 살펴볼게요.

순서대로 번호가 매겨진 리스트 자료구조를 상징하는 나무 상자들

1. 리스트 (list) — 가장 많이 쓰는 자료구조

리스트는 파이썬에서 가장 기본적이고 자주 쓰이는 자료구조예요. 대괄호 []로 만들고, 순서가 있으며 나중에 안의 내용을 마음대로 수정할 수 있다는 것이 가장 큰 특징이에요.

데이터를 꺼낼 때는 인덱스라는 위치 번호를 사용해요. 여기서 제일 중요한 건 파이썬의 인덱스는 0부터 시작한다는 거예요. 첫 번째 값이 1이 아니라 0번 자리라는 걸 꼭 기억해야 해요. 원하는 범위만큼 잘라내는 슬라이싱 기능도 있어요.

기본적인 리스트 생성과 인덱싱, 슬라이싱, 그리고 자주 쓰는 메서드들을 살펴볼게요.

python
# 1. 리스트 생성
fruits = ["사과", "바나나", "포도", "딸기", "수박"]

# 2. 인덱싱 (위치로 꺼내기)
print(fruits[0])    # "사과" (0번째 요소)
print(fruits[-1])   # "수박" (마지막 요소는 -1로 꺼낼 수 있어요)

# 3. 슬라이싱 (범위로 잘라내기)
# 시작번호:끝번호 형식인데, 끝번호는 포함하지 않아요!
print(fruits[1:3])  # ["바나나", "포도"] (인덱스 1부터 2까지만 나옴)

# 4. 주요 메서드 사용하기
fruits.append("오렌지")   # 맨 뒤에 추가
fruits.insert(0, "망고")  # 0번 위치에 삽입
fruits.remove("바나나")   # 바나나 삭제
popped = fruits.pop()    # 맨 마지막 요소 꺼내서 변수에 담기

리스트를 다룰 때 인덱싱만큼 중요한 기능들이니 꼭 직접 타이핑해서 결과를 확인해 보세요.

여기서 초보자들이 정말 많이 당황하는 문제가 하나 있어요. 바로 리스트를 다른 변수에 복사할 때 생기는 문제예요. 리스트를 = 기호로 다른 변수에 넣으면 값 자체가 복사되는 게 아니라, 데이터가 있는 메모리 주소(참조)만 공유하게 돼요. 이럴 때는 안전하게 복사하는 방법을 알아야 해요. 파이썬 리스트 복사 가이드를 보면 copy 모듈을 사용해서 이 문제를 해결하는 방법이 잘 나와 있어요.

⚠️ Warning

리스트 안의 데이터가 바뀌면 안 될 때는 단순히 ‘=’ 기호로 할당하면 안 돼요. 원본 데이터가 같이 손상될 수 있어요.

단순 할당과 올바른 복사 방법의 차이를 코드로 확인해 볼게요.

python
list_copy.py
import copy

# 1. 잘못된 복사 (참조 공유)
original_list = [1, 2, 3]
fake_copy = original_list
fake_copy[0] = 99

print(original_list)  # [99, 2, 3] - 원본까지 같이 바뀌어버려요!

# 2. 올바른 얕은 복사 (리스트의 메서드 사용)
safe_list = [1, 2, 3]
real_copy = safe_list.copy()
real_copy[0] = 99

print(safe_list)      # [1, 2, 3] - 원본은 안전하게 유지돼요.
내용물을 변경할 수 없는 튜플 자료구조를 상징하는 자물쇠가 채워진 유리 진열장

2. 튜플 (tuple) — 바뀌면 안 되는 데이터

튜플은 리스트와 거의 비슷하게 생겼어요. 차이점이 있다면 대괄호 [] 대신 소괄호 ()를 쓴다는 것, 그리고 한 번 만들면 안의 내용을 절대 수정할 수 없다는 점이에요.

“수정할 수 없으면 불편한 거 아니야?”라고 생각할 수 있어요. 하지만 프로그램 설정값, GPS 좌표(위도, 경도), RGB 색상값처럼 중간에 값이 바뀌면 큰일 나는 데이터들이 있죠. 이런 데이터를 다룰 때는 실수로 값이 변경되는 걸 막아주는 튜플이 아주 유용해요.

튜플을 만들고 언패킹하는 방법, 그리고 수정하려고 할 때 발생하는 에러를 살펴볼게요.

python
# 1. 튜플 생성
point = (3, 7)         # 좌표 데이터
rgb = (255, 128, 0)    # 색상 데이터

# 2. 튜플 언패킹 (여러 변수에 한 번에 값 나누어 담기)
x, y = point           # x에는 3, y에는 7이 들어갑니다.
print(x, y)

# 3. 요소가 1개인 튜플을 만들 때 주의점
single_tuple = (42,)   # 쉼표를 꼭 찍어야 튜플로 인식해요!
not_tuple = (42)       # 쉼표가 없으면 그냥 숫자 42로 취급해요.

# 4. 튜플 수정 시도 (에러 발생)
# point[0] = 10        # TypeError: 'tuple' object does not support item assignment

❗ 중요

요소가 하나뿐인 튜플을 만들 때는 값 뒤에 쉼표를 찍는 것을 절대 잊지 마세요. 쉼표가 없으면 파이썬은 그냥 괄호로 묶인 일반 숫자로 오해해요.

이름표로 데이터를 찾는 딕셔너리 자료구조를 상징하는 서랍장

3. 딕셔너리 (dict) — 이름으로 찾는 자료구조

앞서 본 리스트와 튜플은 데이터가 들어간 ‘순서(인덱스)’로 값을 찾았죠. 반면에 딕셔너리는 키(Key)와 값(Value)의 쌍으로 데이터를 저장해요. 마치 사전에서 단어를 찾으면 뜻이 나오는 것과 같아요. 중괄호 {} 안에 키: 값 형태로 만들어요.

딕셔너리에서 값을 꺼내는 방법은 두 가지가 있어요. 대괄호 []를 쓰는 방법과 .get() 메서드를 쓰는 방법이에요. 두 방법은 없는 키를 찾을 때 완전히 다르게 동작해요.

python
# 1. 딕셔너리 생성
person = {
    "name": "김파이썬",
    "age": 25,
    "city": "서울"
}

# 2. 데이터 추가 및 수정
person["job"] = "개발자"  # 새로운 키와 값 추가
person["age"] = 26        # 기존 키의 값 수정

# 3. 값 꺼내기: [] 방식 vs get() 방식
print(person["name"])     # "김파이썬"

# print(person["email"])  # 대괄호 방식은 키가 없으면 KeyError가 발생하면서 프로그램이 멈춰요!
print(person.get("email"))          # get() 방식은 키가 없으면 에러 없이 None을 반환해요.
print(person.get("email", "없음"))  # None 대신 기본값("없음")을 나오게 할 수도 있어요.

💡 Tip

실무에서는 존재하지 않는 키를 호출했을 때 프로그램이 갑자기 멈추는 걸 막기 위해 안전한 .get() 방식을 훨씬 많이 사용해요.

딕셔너리를 사용할 때 한 가지 중요한 규칙이 있어요. 파이썬 딕셔너리 키 제약조건을 살펴보면, 키는 반드시 변하지 않는 값(불변형)이어야 한다고 나와 있어요. 그래서 내용은 바뀔 수 있는 리스트는 키로 쓸 수 없지만, 수정이 불가능한 튜플이나 문자열, 숫자는 키로 쓸 수 있어요.

python
# 1. 튜플은 딕셔너리의 키로 사용할 수 있어요 (불변형이라 안전함)
map_data = {
    (37.5665, 126.9780): "서울시청",
    (35.1795, 129.0756): "부산시청"
}
print(map_data[(37.5665, 126.9780)])  # "서울시청"

# 2. 리스트는 키로 사용할 수 없어요 (가변형이라 에러 발생)
# invalid_dict = {
#     [1, 2]: "이건 안 됩니다!"  # TypeError: unhashable type: 'list'
# }

튜플을 언제 써야 할지 막막했다면, 이렇게 딕셔너리의 키로 활용할 때 아주 찰떡궁합이라는 걸 기억해 두세요.

중복된 데이터를 걸러내는 집합 자료구조를 상징하는 체와 구슬들

4. 집합 (set) — 중복 없는 자료구조

마지막으로 알아볼 자료구조는 집합이에요. 중괄호 {}로 만든다는 점은 딕셔너리와 같지만, 키:값 형태가 아니라 값만 나열해요. 집합의 가장 큰 특징은 데이터의 중복을 절대 허용하지 않고, 순서도 없다는 점이에요.

이런 특징 덕분에 리스트 안에 들어있는 지저분한 중복 데이터들을 한 번에 깔끔하게 정리할 때 아주 유용하게 쓰여요. 수학 시간에 배웠던 교집합, 합집합, 차집합 같은 연산도 그대로 사용할 수 있어요.

python
# 1. 리스트의 중복 제거하기 (가장 많이 쓰는 용도!)
raw_data = [1, 2, 2, 3, 3, 3, 4]
unique_data = list(set(raw_data))  # set으로 바꿔서 중복을 날리고 다시 list로 묶기
print(unique_data)                 # [1, 2, 3, 4]

# 2. 빈 집합 만들기 (주의 필요)
empty_dict = {}     # 중괄호만 쓰면 빈 딕셔너리가 만들어져요.
empty_set = set()   # 빈 집합을 만들 때는 반드시 set() 함수를 써야 해요.

# 3. 집합 연산
python_students = {"김철수", "이영희", "박민준"}
java_students   = {"이영희", "최수진", "박민준"}

print(python_students & java_students)  # 교집합: {'이영희', '박민준'}
print(python_students | java_students)  # 합집합: {'최수진', '김철수', '이영희', '박민준'}
print(python_students - java_students)  # 차집합: {'김철수'}

📌 Note

빈 집합을 만들 때 s = {}라고 쓰면 파이썬은 빈 딕셔너리로 오해하니까, 꼭 set()이라고 명시해 줘야 해요.

4가지 파이썬 자료구조의 특징을 한눈에 보여주는 깔끔한 책상

한눈에 보는 4가지 자료구조 비교 및 자주 하는 실수

지금까지 배운 4가지 자료구조를 한눈에 들어오게 표로 정리해 드릴게요. 이것만 기억해도 상황에 맞는 자료구조를 쉽게 고를 수 있어요.

구분 list tuple dict set
만드는 방법 [1, 2, 3] (1, 2, 3) {"k": 1} {1, 2, 3}
순서 있음 있음 있음(삽입순) 없음
수정 가능 가능 불가 가능 가능
중복 허용 허용 허용 키는 불가 불가
접근 방식 인덱스 [0] 인덱스 [0] ["name"] 없음
  • list: 순서가 있는 목록이 필요하고 데이터가 계속 추가, 삭제될 때
  • tuple: 절대 바뀌면 안 되는 설정값이나 좌표를 묶어둘 때
  • dict: 데이터를 이름(키)으로 빠르고 직관적으로 찾아야 할 때
  • set: 데이터에서 중복을 없애거나, 두 그룹 간의 공통점/차이점을 비교할 때

마지막으로, 입문자들이 코드 작성 시 가장 많이 하는 실수 4가지를 모아봤어요. 눈으로 쓱 훑어보면서 나는 이런 실수를 하지 않도록 주의해 봐요.

python
# 실수 1: 인덱스가 1부터 시작한다고 착각하기
fruits = ["사과", "바나나", "포도"]
# print(fruits[1])  # '사과'가 아니라 '바나나'가 나와요. 첫 번째는 0번이에요.

# 실수 2: 슬라이싱할 때 끝자리가 포함된다고 착각하기
# fruits[1:3] 은 인덱스 1과 2만 가져와요. 3번 자리는 가져오지 않아요.

# 실수 3: 빈 집합을 만들 때 중괄호 쓰기
# s = {}      # 이건 딕셔너리예요.
# s = set()   # 이렇게 해야 집합이 돼요.

# 실수 4: 1개짜리 튜플에 쉼표 빠뜨리기
# t = (42)    # 그냥 숫자 42예요.
# t = (42,)   # 쉼표가 있어야 튜플이에요.

코드를 짜다가 에러가 난다면 이 4가지 중에 하나일 확률이 아주 높으니 꼭 체크해 보세요.

파이썬 자료구조에 대해 자주 묻는 질문들을 탐구하는 모습

자주 묻는 질문

Q. 리스트를 새로운 변수에 할당하고 수정했는데 원본 리스트도 같이 바뀌었어요. 왜 그런가요?

파이썬에서 리스트 같은 자료구조를 다른 변수에 = 기호로 바로 할당하면, 안의 데이터를 새로 복사하는 게 아니에요. 데이터가 저장된 메모리 주소(참조) 하나를 두 변수가 같이 쳐다보게 되거든요. 원본은 그대로 두고 독립적인 복사본을 만들고 싶다면 리스트.copy() 메서드를 쓰거나 copy 모듈의 기능들을 사용해야 해요.

Q. 딕셔너리의 키(key)로 리스트를 사용할 수 있나요?

아니요, 리스트는 딕셔너리의 키로 사용할 수 없어요. 딕셔너리의 키는 누군가 중간에 값을 바꿀 수 없는 ‘불변(immutable)’ 객체여야만 해요. 문자열이나 숫자, 그리고 안의 내용을 바꿀 수 없는 튜플은 키로 쓸 수 있지만, 값을 맘대로 추가하고 뺄 수 있는 가변(mutable) 객체인 리스트나 집합은 키로 쓸 수 없답니다.

Q. 빈 집합(set)을 만들 때 s = {} 처럼 중괄호를 사용하면 안 되나요?

네, 안 돼요. 파이썬에서 빈 중괄호 {}는 빈 딕셔너리를 만드는 데 이미 사용되고 있거든요. 집합도 중괄호를 사용하긴 하지만, 아무 데이터도 없는 빈 집합을 처음 선언할 때는 반드시 set()이라는 함수 형태를 사용해야 파이썬이 딕셔너리와 헷갈리지 않아요.

이 글이 마음에 드세요?

RSS 피드를 구독하세요!

댓글 남기기