반응형

14. 튜플과 세트 - 용도에 맞는 그릇 선택
리스트와 딕셔너리를 배웠다면, 이제 나머지 두 자료구조를 알아보자. 튜플은 "절대 바뀌면 안 되는" 데이터에, 세트는 "중복 없는" 데이터에 딱 맞는 그릇이다.
튜플 (tuple)
튜플이란?
리스트와 비슷하지만 한 번 만들면 수정할 수 없는 자료구조다.
# 리스트: 대괄호 []
my_list = [1, 2, 3]
my_list[0] = 999 # OK! 수정 가능
# 튜플: 소괄호 ()
my_tuple = (1, 2, 3)
my_tuple[0] = 999 # Error! 수정 불가
튜플 만들기
# 기본 생성
colors = ("빨강", "초록", "파랑")
# 괄호 생략 가능
point = 10, 20
# 요소가 1개인 튜플은 쉼표 필수!
single = (42,) # 튜플
not_tuple = (42) # 그냥 숫자 42
# 빈 튜플
empty = ()
⚠️ 주의:
(42)는 수학의 괄호로 인식되어 그냥 정수 42가 된다. 요소가 1개인 튜플은 반드시(42,)처럼 쉼표를 붙여야 한다.
튜플 접근 (인덱싱, 슬라이싱)
리스트와 동일하다. 읽기만 가능하고 수정만 안 되는 것.
colors = ("빨강", "초록", "파랑", "노랑", "보라")
print(colors[0]) # 빨강
print(colors[-1]) # 보라
print(colors[1:3]) # ('초록', '파랑')
print(len(colors)) # 5
튜플은 왜 쓸까?
"수정 안 되면 불편한 거 아닌가?" 오히려 장점이 있다.
| 장점 | 설명 |
|---|---|
| 안전성 | 실수로 데이터를 바꾸는 버그 방지 |
| 성능 | 리스트보다 약간 빠르고 메모리도 적게 사용 |
| 딕셔너리 키 | 튜플은 딕셔너리의 키로 사용 가능 (리스트는 불가) |
| 의도 표현 | "이 데이터는 변경하지 마세요"라는 의미 전달 |
# 변하지 않아야 하는 데이터에 적합
DAYS = ("월", "화", "수", "목", "금", "토", "일")
RGB_RED = (255, 0, 0)
ORIGIN = (0, 0)
튜플 언패킹
여러 값을 한 번에 변수에 할당할 수 있다.
# 기본 언패킹
point = (10, 20)
x, y = point
print(x) # 10
print(y) # 20
# 함수에서 여러 값 반환 (실은 튜플!)
def get_min_max(numbers):
return min(numbers), max(numbers)
low, high = get_min_max([3, 7, 1, 9, 2])
print(f"최소: {low}, 최대: {high}") # 최소: 1, 최대: 9
# 변수 교환 (파이썬의 마법!)
a, b = 1, 2
a, b = b, a # 사실은 튜플 언패킹
print(a, b) # 2 1
세트 (set)
세트란?
중복을 허용하지 않고, 순서가 없는 자료구조다. 수학의 집합과 같다.
# 기본 생성
fruits = {"사과", "바나나", "포도"}
# 중복은 자동 제거!
numbers = {1, 2, 3, 2, 1, 3, 4}
print(numbers) # {1, 2, 3, 4}
# 리스트에서 중복 제거
data = [1, 2, 2, 3, 3, 3, 4]
unique = set(data)
print(unique) # {1, 2, 3, 4}
print(list(unique)) # [1, 2, 3, 4] (다시 리스트로)
⚠️ 주의: 빈 세트는
set()으로 만든다.{}는 빈 딕셔너리!
empty_set = set() # 빈 세트
empty_dict = {} # 빈 딕셔너리
세트 메서드
fruits = {"사과", "바나나", "포도"}
# 추가
fruits.add("딸기")
print(fruits) # {'사과', '바나나', '포도', '딸기'}
# 삭제
fruits.remove("바나나") # 없으면 에러
fruits.discard("키위") # 없어도 에러 안 남
# 포함 여부
print("사과" in fruits) # True
집합 연산 (세트의 진짜 힘!)

a = {1, 2, 3, 4, 5}
b = {4, 5, 6, 7, 8}
# 합집합: 둘을 합치기
print(a | b) # {1, 2, 3, 4, 5, 6, 7, 8}
print(a.union(b))
# 교집합: 공통 요소
print(a & b) # {4, 5}
print(a.intersection(b))
# 차집합: a에만 있는 것
print(a - b) # {1, 2, 3}
print(a.difference(b))
# 대칭차집합: 한쪽에만 있는 것
print(a ^ b) # {1, 2, 3, 6, 7, 8}
print(a.symmetric_difference(b))
| 연산 | 기호 | 설명 |
|---|---|---|
| 합집합 | a | b | 둘 중 하나라도 포함 |
| 교집합 | a & b | 둘 다 포함 |
| 차집합 | a - b | a에만 포함 |
| 대칭차집합 | a ^ b | 한쪽에만 포함 |
실전 활용 예제
출석 체크
enrolled = {"김철수", "이영희", "박민수", "최지원", "정다은"}
attended = {"김철수", "박민수", "정다은"}
absent = enrolled - attended
print(f"결석자: {absent}") # {'이영희', '최지원'}
공통 관심사 찾기
user_a = {"파이썬", "자바", "웹개발", "데이터분석"}
user_b = {"파이썬", "자바스크립트", "웹개발", "디자인"}
common = user_a & user_b
print(f"공통 관심사: {common}") # {'파이썬', '웹개발'}
only_a = user_a - user_b
print(f"A만의 관심사: {only_a}") # {'자바', '데이터분석'}
중복 제거 + 순서 유지
세트는 순서가 없으므로, 순서를 유지하면서 중복을 제거하려면 리스트 방식을 사용한다.
data = [3, 1, 4, 1, 5, 9, 2, 6, 5, 3]
# 세트로 중복 제거 (순서 무시)
print(set(data)) # {1, 2, 3, 4, 5, 6, 9}
# 순서 유지하며 중복 제거
seen = set()
unique = []
for item in data:
if item not in seen:
seen.add(item)
unique.append(item)
print(unique) # [3, 1, 4, 5, 9, 2, 6]
직접 해보기
문제 1. 두 리스트의 공통 요소를 세트 연산으로 찾아보자.
list1 = [1, 2, 3, 4, 5, 6]
list2 = [4, 5, 6, 7, 8, 9]
# 결과: 공통: {4, 5, 6}
문제 2. 좌표를 튜플로 표현하고, 두 점 사이의 거리를 구해보자.
point1 = (3, 4)
point2 = (7, 1)
# 힌트: 거리 = ((x2-x1)**2 + (y2-y1)**2) ** 0.5
문제 3. 로또 번호 생성기를 만들어보자. (1~45 중 중복 없이 6개)
이번 주 로또 번호: [3, 12, 17, 28, 35, 42]
정답 보기
# 문제 1
list1 = [1, 2, 3, 4, 5, 6]
list2 = [4, 5, 6, 7, 8, 9]
common = set(list1) & set(list2)
print(f"공통: {common}")
# 문제 2
point1 = (3, 4)
point2 = (7, 1)
x1, y1 = point1
x2, y2 = point2
distance = ((x2 - x1)**2 + (y2 - y1)**2) ** 0.5
print(f"거리: {distance:.2f}") # 5.00
# 문제 3
import random
lotto = set()
while len(lotto) < 6:
lotto.add(random.randint(1, 45))
result = sorted(lotto)
print(f"이번 주 로또 번호: {result}")
# 또는 간단하게:
# result = sorted(random.sample(range(1, 46), 6))
오늘의 정리
| 자료구조 | 기호 | 수정 | 중복 | 핵심 용도 |
|---|---|---|---|---|
| 리스트 | [ ] | O | O | 순서 있는 데이터 모음 |
| 튜플 | ( ) | X | O | 변하면 안 되는 데이터 |
| 세트 | { } | O | X | 중복 제거, 집합 연산 |
| 딕셔너리 | {k: v} | O | 키X | 키-값 매핑 |
다음 편 예고: 컴프리헨션 - 파이썬다운 코드 작성법
for문으로 리스트를 만드는 코드를 한 줄로 줄일 수 있다면? 파이썬만의 강력한 문법인 컴프리헨션을 알아보자.
태그: 파이썬 Python 파이썬독학 튜플 tuple 세트 set 불변 중복제거 자료구조 파이썬기초 IT교육
반응형
'Python' 카테고리의 다른 글
| 16. 자료구조 비교 총정리 - 상황별 선택 가이드 (0) | 2026.02.22 |
|---|---|
| 15. 컴프리헨션 - 파이썬다운 코드 작성법 (0) | 2026.02.22 |
| 13. 딕셔너리 - 이름표를 붙인 데이터 (0) | 2026.02.22 |
| 12. 리스트 - 데이터를 줄 세우기 (0) | 2026.02.22 |
| 11. 실습: 숫자 맞추기 게임 만들기 (0) | 2026.02.21 |
댓글