리스트 vs 튜플 vs 딕셔너리 vs 집합
언제 뭘 써야 할까?
Jun 2, 2025
“리스트, 튜플, 딕셔너리, 집합”
코드를 짜다 보면 자연스럽게 마주치게 되는 자료형들.
처음엔 비슷해 보이지만,
하나하나 뜯어보면 전혀 다른 성격을 가진 친구들이다.
어떤 건 순서가 있고,
어떤 건 중복을 허용하지 않고,
어떤 건 변경이 가능하지도 않다.
자료형의 특성을 제대로 이해하고 쓰면,
더 깔끔하고 효율적인 코드를 짤 수 있다.
1. 리스트 (list)
-
- 정의: 순서가 있는 변경 가능한(mutable) 자료형
-
- 형태: [요소1, 요소2, …]
-
- 특징
(1) 요소 추가, 삭제, 수정 가능
(2) 인덱싱(indexing), 슬라이싱(slicing) 가능
- 특징
예시
my_list = [10, 20, 30]
my_list.append(40)
print(my_list[1]) # 20
주요 메서드
메서드 | 설명 | 예시 |
---|---|---|
append(x) |
맨 뒤에 요소 추가 | a.append(3) |
insert(i, x) |
특정 위치에 요소 삽입 | a.insert(1, 10) |
extend(iter) |
리스트 뒤에 다른 iterable 추가 | a.extend([4,5]) |
remove(x) |
해당 값 제거 (첫 번째만) | a.remove(2) |
pop([i]) |
인덱스 위치 요소 꺼내기 (기본 마지막) | a.pop() |
clear() |
모든 요소 제거 | a.clear() |
index(x) |
값의 첫 번째 인덱스 반환 | a.index(10) |
count(x) |
특정 값의 개수 반환 | a.count(2) |
sort() |
정렬 (기본 오름차순) | a.sort() |
reverse() |
순서 반전 | a.reverse() |
관련 함수
함수 | 설명 |
---|---|
len(a) | 요소 개수 |
sum(a) | 합계 (숫자일 때) |
max(a), min(a) | 최대값, 최소값 |
2. 튜플 (tuple)
-
- 정의: 순서가 있는 변경 불가능한(immutable) 자료형
-
- 형태: (요소1, 요소2, …)
-
- 특징
(1) 한 번 선언되면 값을 바꿀 수 없음
(2) 불변성 덕분에 보안성, 성능 측면에서 장점 있음
- 특징
예시
my_tuple = (10, 20, 30)
print(my_tuple[0]) # 10
주요 메서드
메서드 | 설명 | 예시 |
---|---|---|
count(x) |
값의 개수 반환 | t.count(3) |
index(x) |
값의 첫 인덱스 반환 | t.index(2) |
튜플은 불변형이므로 값 추가/삭제 관련 메서드 없음
관련 함수
함수 | 설명 |
---|---|
len(t) | 요소 개수 |
sum(t) | 합계 (숫자일 때) |
max(t), min(t) | 최대값, 최소값 |
3. 딕셔너리 (dict)
-
- 정의: 키(key):값(value) 쌍으로 이루어진 변경 가능한 자료형
-
- 형태: {key1: value1, key2: value2, …}
-
- 특징
(1) 순서 보장 (파이썬 3.7+)
(2) 키 중복 불가, 값은 중복 가능
(3) 키로는 해시 가능한(immutable) 타입만 사용 가능
- 특징
예시
my_dict = {'name': '지희', 'age': 25}
print(my_dict['name']) # 지희
주요 메서드
메서드 | 설명 | 예시 |
---|---|---|
get(key) |
키의 값을 반환 (없으면 None ) |
d.get('name') |
keys() |
키 목록 반환 | d.keys() |
values() |
값 목록 반환 | d.values() |
items() |
(키, 값) 쌍 목록 반환 | d.items() |
update(dict) |
딕셔너리 값 업데이트 | d.update({'age': 30}) |
pop(key) |
키 삭제하고 값 반환 | d.pop('name') |
popitem() |
마지막 키-값 쌍 제거 | d.popitem() |
clear() |
모든 요소 제거 | d.clear() |
setdefault(k, v) |
키가 없으면 새 키와 값 추가 | d.setdefault('hobby', 'book') |
관련 함수
함수 | 설명 |
---|---|
len(d) | 항목 개수 |
in 연산자 | 키 존재 여부 확인 → ‘name’ in d |
4. 집합 (set)
-
- 정의: 중복 없는 요소들의 모음, 순서 없음
-
- 형태: {요소1, 요소2, …}
(빈 집합은 set() 으로 생성해야 함)
- 형태: {요소1, 요소2, …}
-
- 특징
(1) 중복 제거, 교집합/합집합 등 집합 연산 가능
(2) 순서 없음 → 인덱싱 불가
- 특징
예시
my_set = {1, 2, 3, 3, 2}
print(my_set) # {1, 2, 3}
주요 메서드
메서드 | 설명 | 예시 |
---|---|---|
add(x) |
요소 추가 | s.add(3) |
update(iter) |
여러 요소 한꺼번에 추가 | s.update([4,5]) |
remove(x) |
요소 제거 (없으면 오류 발생) | s.remove(2) |
discard(x) |
요소 제거 (없으면 무시) | s.discard(2) |
pop() |
임의의 요소 제거 | s.pop() |
clear() |
전체 요소 제거 | s.clear() |
union(s2) |
합집합 반환 | s1.union(s2) |
intersection(s2) |
교집합 반환 | s1.intersection(s2) |
difference(s2) |
차집합 반환 | s1.difference(s2) |
issubset(s2) |
부분집합인지 확인 | s1.issubset(s2) |
issuperset(s2) |
상위집합인지 확인 | s1.issuperset(s2) |
copy() |
집합 복사 | s2 = s1.copy() |
관련 함수
함수 | 설명 |
---|---|
len(s) | 요소 개수 |
max(t), min(t) | 최대값, 최소값 |
in 연산자 | 원소 존재 여부 확인 |
5. 자료형 비교 분석
항목 | 리스트 (list ) |
튜플 (tuple ) |
딕셔너리 (dict ) |
집합 (set ) |
---|---|---|---|---|
순서 | O | O | O (Python 3.7+) | X |
중복 허용 | O | O | 키: X / 값: O | X |
변경 가능 | O | X | O | O |
인덱싱 | O | O | 키 접근 | X |
형태 | [1, 2, 3] |
(1, 2, 3) |
{'a': 1, 'b': 2} |
{1, 2, 3} |
사용 목적 | 순서 있는 데이터 | 고정된 데이터 | 구조적 데이터 표현 | 중복 제거, 집합 연산 |
사용 상황 예시
항목 | 상황 예시 |
---|---|
list | 학생들의 출석부 (순서 중요 + 수정 필요) |
tuple | 고정된 좌표값 (불변) |
dict | 학생 정보 저장 (학번: 이름) |
set | 중복 제거가 필요한 태그 목록 |
오늘을 마치며
자료형을 제대로 이해하는 건
단순한 문법 그 이상으로, 좋은 코드의 시작점이다.
앞으로 데이터를 다룰 때 어떤 자료형을 선택하고 왜 그렇게 했는지
“의도적인 선택”을 할 수 있다면,
지금보다 훨씬 더 단단한 코드를 짤 수 있을 것이다.