
✅ 튜플(Tuple): 여러 개의 값을 가질 수 있는 순차적인 자료구조
여러가지 데이터들을 ,로 구분하여 ()로 감싼 구조
저장되는 요소들이 모두 같은 자료형일 필요가 없다.
파이썬의 리스트와 다르게 내부의 값을 수정하거나 삭제할 수 없다.
arr = (0, 1.23, '파이썬', [0, 0])
print(f'arr: {arr}, 타입: {type(arr)}\n')
for idx, value in enumerate(arr):
print(f'arr의 {idx + 1}번째 원소: {value}, 타입: {type(value)}')
arr: (0, 1.23, '파이썬', [0, 0]), 타입: <class 'tuple'>
arr의 1번째 원소: 0, 타입: <class 'int'>
arr의 2번째 원소: 1.23, 타입: <class 'float'>
arr의 3번째 원소: 파이썬, 타입: <class 'str'>
arr의 4번째 원소: [0, 0], 타입: <class 'list'>
튜플의 인덱스(Index)로 튜플의 원소에 접근할 수 있으며, 0부터 (튜플의 크기 - 1)까지로 구성된다.
이때, 리스트와 마찬가지로 -1을 사용할 경우 튜플의 크기와 관계없이 튜플의 마지막 원소를 가져온다.
arr = (10, 20, 30, 40, 50)
print(arr[0], arr[3], arr[4]) # 10 40 50
print(arr[-1]) # 50
그러나 리스트와는 다른 점이 하나 있는데, 한번 생성된 튜플은 인덱싱을 통해 원소를 변경하지 못한다.
arr1 = [10, 20, 30, 40, 50]
arr1[1] = 700
print(arr1) # [10, 700, 30, 40, 50]
arr2 = (10, 20, 30, 40, 50)
arr2[1] = 700
print(arr2)
# TypeError: 'tuple' object does not support item assignment
:을 사용하여 원하는 범위의 값을 가져올 수 있다.arr = (10, 20, 30, 40, 50)
# 1번째 원소 ~ 3번째 원소
print(arr[1:4]) # (20, 30, 40)
# 2번째 원소 ~
print(arr[2:]) # (30, 40, 50)
# ~ 3번째 원소
print(arr[:4]) # (10, 20, 30, 40)
# 모든 원소
print(arr[:]) # (10, 20, 30, 40, 50)
그러나 마찬가지로 리스트와는 다르게 슬라이싱을 통한 수정도 불가능하다.
arr1 = [10, 20, 30, 40, 50]
arr1[1:3] = [2, 3]
print(arr1) # [10, 2, 3, 40, 50]
arr2 = (10, 20, 30, 40, 50)
arr2[1:3] = (2, 3)
print(arr2)
# TypeError: 'tuple' object does not support item assignment
+, *를 사용하여 튜플을 합치거나, 반복하는 작업을 할 수 있다.arr1 = (10, 20, 30)
arr2 = (30, 40, 50)
print(arr1 + arr2) # (10, 20, 30, 30, 40, 50)
print(arr1 * 3) # (10, 20, 30, 10, 20, 30, 10, 20, 30)
이때, 튜플 내부의 값을 수정할 수는 없지만 +를 사용하여 리스트의 append() 함수 또는 extend() 함수와 비슷하게 원소를 추가하는데에 사용할 수 있다.
arr = (10, 20, 30, 40, 50)
arr += (100,)
print(arr) # (10, 20, 30, 40, 50, 100)
arr += (200, 300)
print(arr) # (10, 20, 30, 40, 50, 100, 200, 300)
튜플은 리스트와 다르게 자신에게만 사용가능한 특별한 함수는 존재하지 않는다.
따라서 튜플을 사용할 때 list() 함수를 사용하여 튜플을 리스트로 변환한 후,
리스트의 함수들을 사용하여 값을 조정한 뒤,
다시 tuple() 함수를 사용하여 다시 튜플로 변환해주는 방법을 많이 사용한다.
arr = (10, 20, 30, 40, 50)
arr = list(arr)
print(arr) # [10, 20, 30, 40, 50]
arr.append(100)
print(arr) # [10, 20, 30, 40, 50, 100]
n = arr.pop(3)
print(arr) # [10, 20, 30, 50, 100]
arr = tuple(arr)
print(arr) # (10, 20, 30, 50, 100)
print(len(arr)) # 5

튜플을 정렬할 때도 리스트와 다르게 sort() 함수를 사용할 수 없다.
따라서 list() 함수를 이용하여 정렬을 하거나,
바로 정렬 후 리스트로 값을 반환해주는 sorted() 함수를 사용한다.
arr = (10, 50, 80, 40, 20)
arr.sort()
print(arr)
# AttributeError: 'tuple' object has no attribute 'sort'
arr = (10, 50, 80, 40, 20)
arr = list(arr)
arr.sort()
print(arr) # [10, 20, 40, 50, 80]
arr = tuple(arr)
print(arr) # (10, 20, 40, 50, 80)
arr = (10, 50, 80, 40, 20)
arr = sorted(arr)
print(arr) # [10, 20, 40, 50, 80]
arr = tuple(arr)
print(arr) # (10, 20, 40, 50, 80)
위 코드에서 볼 수 있듯이 sorted() 함수의 경우 따로 리스트로 변경하여 전달하지 않아도 내부적으로 정렬 후, 리스트 형태로 반환해주는 것을 볼 수 있다.