본문 바로가기
Python

14. 튜플과 세트 - 용도에 맞는 그릇 선택

by 샤나엘 2026. 2. 22.
반응형

튜플과 세트

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교육

반응형

댓글