Python 튜플 마스터하기: 생성, 접근, 고급 연산
Python 튜플
Python 튜플의 강력함을 알아보세요. 튜플은 한 번 생성하면 변경할 수 없는 시퀀스로, 속도, 안전성, 이질적 데이터 처리의 다재다능함을 제공합니다. 기본 문법부터 고급 연산까지, 리스트 대신 튜플을 선택해야 할 때를 이해하게 됩니다.
동영상: Python 리스트와 튜플
튜플은 리스트처럼 동작하지만 생성 후에는 불변(immutable)입니다. 리스트와 달리 요소를 변경할 수 없어 고정된 데이터 세트에 이상적입니다.
튜플 생성하기
튜플은 쉼표로 구분된 값을 괄호 () 안에 넣어 정의합니다. 괄호는 선택 사항이지만 가독성을 위해 권장됩니다.
튜플은 임의의 개수 항목을 담을 수 있으며 정수, 실수, 문자열, 리스트, 다른 튜플 등 데이터 타입을 혼합할 수 있습니다.
# 다양한 튜플 유형
# 빈 튜플
my_tuple = ()
print(my_tuple)
# 정수 튜플
my_tuple = (1, 2, 3)
print(my_tuple)
# 혼합 데이터 타입
my_tuple = (1, "Hello", 3.4)
print(my_tuple)
# 중첩 튜플
my_tuple = ("mouse", [8, 4, 6], (1, 2, 3))
print(my_tuple)
출력
() (1, 2, 3) (1, 'Hello', 3.4) ('mouse', [8, 4, 6], (1, 2, 3))
괄호 없이도 튜플을 만들 수 있는데, 이를 튜플 패킹(tuple packing)이라고 합니다.
my_tuple = 3, 4.6, "dog"
print(my_tuple)
# 튜플 언패킹
a, b, c = my_tuple
print(a)
print(b)
print(c)
출력
(3, 4.6, 'dog') 3 4.6 dog
요소가 하나뿐인 튜플은 일반 값과 구별하기 위해 끝에 쉼표가 필요합니다.
my_tuple = ("hello")
print(type(my_tuple)) # <class 'str'>
# 단일 요소 튜플
my_tuple = ("hello",)
print(type(my_tuple)) # <class 'tuple'>
# 괄호 생략 가능
my_tuple = "hello",
print(type(my_tuple)) # <class 'tuple'>
출력
<class 'str'> <class 'tuple'> <class 'tuple'>
튜플 요소 접근하기
튜플은 여러 방식으로 요소에 접근합니다:
1. 인덱싱
인덱스 연산자 []를 0-기반 인덱스와 함께 사용. 범위 초과 시 IndexError, 비정수 인덱스 시 TypeError.
# 인덱싱 예제
my_tuple = ('p','e','r','m','i','t')
print(my_tuple[0]) # 'p'
print(my_tuple[5]) # 't'
# 중첩 인덱싱
n_tuple = ("mouse", [8, 4, 6], (1, 2, 3))
print(n_tuple[0][3]) # 's'
print(n_tuple[1][1]) # 4
출력
p t s 4
2. 음수 인덱싱
음수 인덱스는 끝에서부터 셉니다: -1은 마지막 요소.
# 음수 인덱싱
my_tuple = ('p', 'e', 'r', 'm', 'i', 't')
print(my_tuple[-1]) # 't'
print(my_tuple[-6]) # 'p'
출력
t p
3. 슬라이싱
start:stop 구문으로 부분 튜플 추출.
# 슬라이싱 예제
my_tuple = ('p','r','o','g','r','a','m','i','z')
print(my_tuple[1:4]) # ('r', 'o', 'g')
print(my_tuple[:-7]) # ('p', 'r')
print(my_tuple[7:]) # ('i', 'z')
print(my_tuple[:]) # 전체 튜플
출력
('r', 'o', 'g') ('p', 'r') ('i', 'z') ('p', 'r', 'o', 'g', 'r', 'a', 'm', 'i', 'z')
튜플 수정하기
튜플은 불변입니다. 요소에 직접 대입하면 TypeError:
# 수정 시도
my_tuple = (4, 2, 3, [6, 5])
# my_tuple[1] = 9 # TypeError
하지만 요소가 가변 객체(예: 리스트)라면 내부 상태는 변경 가능:
my_tuple[3][0] = 9
print(my_tuple) # (4, 2, 3, [9, 5])
튜플 자체를 새 값으로 재할당은 가능:
my_tuple = ('p', 'r', 'o', 'g', 'r', 'a', 'm', 'i', 'z')
print(my_tuple)
+로 연결, *로 반복 가능하며 둘 다 새 튜플을 반환합니다.
print((1, 2, 3) + (4, 5, 6)) # (1, 2, 3, 4, 5, 6)
print(("Repeat",) * 3) # ('Repeat', 'Repeat', 'Repeat')
출력
(1, 2, 3, 4, 5, 6) ('Repeat', 'Repeat', 'Repeat')
튜플 삭제하기
개별 항목은 제거할 수 없습니다. del로 튜플 전체만 삭제 가능:
my_tuple = ('p', 'r', 'o', 'g', 'r', 'a', 'm', 'i', 'z')
# del my_tuple[3] # TypeError
del my_tuple
# print(my_tuple) # NameError
출력
Traceback (most recent call last): File "<string>", line 12, in <module> NameError: name 'my_tuple' is not defined
튜플 메서드
튜플은 count()와 index() 두 개의 내장 메서드만 제공합니다.
my_tuple = ('a', 'p', 'p', 'l', 'e')
print(my_tuple.count('p')) # 2
print(my_tuple.index('l')) # 3
출력
2 3
기타 튜플 연산
1. 멤버십 테스트
in 키워드로 존재 여부 확인.
my_tuple = ('a', 'p', 'p', 'l', 'e')
print('a' in my_tuple)
print('b' in my_tuple)
print('g' not in my_tuple)
출력
True False True
2. 순회
for 루프로 튜플 순회:
for name in ('John', 'Kate'):
print("Hello", name)
출력
Hello John Hello Kate
3. 리스트 대비 장점
- 이질적 데이터에 적합; 리스트는 보통 동질적.
- 불변성 덕분에 순회 시 성능 이점.
- 불변 요소만 가진 튜플은 딕셔너리 키로 사용 가능.
- 쓰기 보호된 데이터 보장으로 실수 수정 방지.