📘 튜플이란?
- 여러 개의 값을 하나의 변수에 담는 불변 자료형
() 소괄호로 묶어서 저장
- 요소의 순서가 있고, 중복 허용
- 각 항목은 인덱스로 접근 (0부터 시작)
- 값을 추가, 수정, 삭제할 수 없음 (불변성)
- 다양한 데이터 타입을 포함
- 값이 변경되면 안되는 데이터에 적합
t1 = ()
t2 = (1, )
t3 = (1, 2)
t4 = 1, 2
t5 = ('x', 'y', ('xy', 'zz'))
🔎 튜플 다루기
1. 튜플 생성
1-1. () 괄호를 사용한 생성
numbers = (1, 2, 3)
fruits = ('apple', 'banana', 'cherry')
mixed = (1, 'apple', 3.14, True)
print(numbers)
print(fruits)
print(mixed)
1-2. 괄호 없이 생성 (튜플 패킹)
my_tuple = 1, 2, 3
print(my_tuple)
print(type(my_tuple))
1-3. 단일 요소 튜플 생성 시 주의점
- 요소가 하나뿐인 튜플을 생성할 때는
,를 반드시 포함해야함
single_element = (5,)
print(single_element)
print(type(single_element))
not_a_tuple = (5)
print(type(not_a_tuple))
1-4. tuple() 함수를 사용한 생성
my_list = [1, 2, 3]
my_tuple = tuple(my_list)
print(my_tuple)
string = 'hello'
char_tuple = tuple(string)
print(char_tuple)
2. 튜플의 인덱싱
- 인덱스를 사용하여 튜플의 특정 위치에 있는 요소에 접근할 수 있음
- 인덱스는 0부터 시작, 음수를 사용하면 뒤에서부터 접근
eng = ('a', 'b', 'c', 'd')
print(eng[0])
print(eng[2])
print(eng[-1])
print(eng[-2])
3. 튜플의 슬라이싱
- 튜플의 일부를 잘라내어 새로운 튜플을 만드는 방법
- 문법은 리스트의 슬라이싱과 동일
nums = (0, 1, 2, 3, 4, 5, 6)
print(nums[2:5])
print(nums[:3])
print(nums[4:])
print(nums[::2])
print(nums[::-1])
4. 튜플의 불변성
- 튜플은 불변 자료형으로, 생성된 후에는 요소를 변경할 수 없음
tup1 = (1, 2, 3)
tup1[0] = 10
tup1 += (4, )
print(tup1)
og_tup = (1, 2, 3)
new_tup = og_tup + (4, )
print(og_tup)
print(new_tup)
5. 튜플 메서드
- 튜플은 불변성이 있어 사용 가능한 메서드가 제한적임
5-1. count(item)
nums = (1, 2, 2, 3, 3, 3)
print(nums.count(2))
print(nums.count(3))
5-2. index(item)
- 튜플에서 첫 번째로 일치하는 요소의 인덱스를 반환
fruits = ('banana', 'cherry', 'mango')
print(fruits.index('banana'))
6. 변수의 패킹과 언패킹
6-1. 패킹
packed_tup = 1, 2, 3
print(packed_tup)
6-2. 언패킹
packed_tup = 1, 2, 3
a, b, c = packed_tup
print(a)
print(b)
print(c)
a, b, *rest = (1, 2, 3, 4, 5)
print(rest)
print(type(rest))
a, *mid, c = (1, 2, 3, 4, 5)
print(mid)
7. 중첩 튜플
nested_tup = (1, (2, 3), (4, (5, 6)))
print(nested_tup[1])
print(nested_tup[2][1])
print(nested_tup[2][1][0])
8. 튜플의 반복문 활용
- 튜플의 각 요소에 접근하거나 처리하기 위해 반복문 사용 가능
8-1. for 루프
fruits = ('banana', 'cherry', 'mango')
for f in fruits:
print(f)
8-2. 인덱스와 함께 반복하기
fruits = ('banana', 'cherry', 'mango')
for index, value in enumerate(fruits):
print(f'인덱스 {index}: {value}')
9. 튜플의 비교와 정렬
- 튜플은 요소별로 비교할 수 있으며, 정렬된 시퀀스를 필요로 하는 경우에 유용
9-1. 튜플의 비교
tup1 = (1, 2, 3)
tup2 = (1, 2, 4)
print(tup1 < tup2)
9-2. 튜플의 정렬
students = [('Alice', 'A', 15), ('Bob', 'B', 12), ('Cali', 'C', 10)]
students_sorted = sorted(students, key=lambda student: student[2])
print(students_sorted)
10. 튜플의 활용
10-1. 딕셔너리의 키로 사용
- 튜플은 불변성이 있기 때문에 딕셔너리의 키로 사용할 수 있음
my_dict = {(1, 2): "P1", (3, 4): "P2"}
print(my_dict[(1, 2)])
10-2. 두 변수의 값 교환
- 튜플의 언패킹을 이용하여 두 변수의 값을 교환할 수 있음
a = 10
b = 20
a, b = b, a
print(a)
print(b)
10-3. 리스트와의 상호 변환
my_tup = (1, 2, 3)
my_list = list(my_tup)
print(my_list)
my_new_tup = tuple(my_list)
print(my_new_tup)
10-4. 여러 변수에 동일한 값 할당
x = y = z = 0
print(x, y, z)
⚙️ 튜플과 리스트의 차이점
- 튜플은 리스트보다 메모리 사용이 적고, 약간 더 빠름
| 특징 | 튜플 | 리스트 |
| --- | --- | --- |
| 기호 | () 또는 생략 | [] |
| 변경 가능성 | 불변 | 변경 가능 |
| 요소 추가/삭제 | 불가능 | 가능 |
| 사용 사례 | 변경이 불가능한 데이터, 키로 사용 | 데이터 조작이 필요한 경우 |