Python 컨테이너 - 튜플과 시퀀스
튜플은 몇가지 점을 제외하면 리스트와 거의 비슷하며, 리스트와 다른점은 다음과 같다.
- 리스트는 [] (대괄호)를 사용하여 원소를 둘러싸지만, 튜플은 () (소괄호)로 둘러싼다.
- 리스트는 가변이지만, 튜플은 불변 자료형이다.
1. 튜플
튜플은 소괄호와 컴마를 사용한다. 이때 컴마가 있다면 괄호를 생략할 수도 있다.
t = ()
t = (1, 2, 3)
t = (1,)
t = 3,
t = 1, 2, 3
t = (1, "Hello", 1.34, (3, 1))
괄호 없이 컴마만 아이템을 나열하는것을 패킹(packing) 이라고 말한다.
1.1 리스트 <- > 튜플
l = [123, 3.14, "Hello"]
t = tuple(l)
print(t) # (123, 3.14, 'Hello')
t = 123, 3.14, "Hello"
l = list(t)
print(l) # [123, 3.14, 'Hello']
1.2 튜플의 불변성
튜플은 불변 객체이기 때문에 리스트처럼 값을 변경하거나 삭제를 하면 에러가 발생한다.
t = (1, 2, 3)
del t[0] # TypeError: 'tuple' object doesn't support item deletion
t[2] = 3 # TypeError: 'tuple' object doesn't support item deletion
당연히 객체를 변경하는 메서드(append와 같은)도 존재하지 않는다.
튜플은 불변이기 때문에 리스트보다 메모리를 적게 사용한다.
l = ["사과", "바나나", "오렌지", 1, 2, 3]
t = tuple(l)
import sys
print(f"리스트 객체의 크기: {sys.getsizeof(l)}") # 리스트 객체의 크기: 104
print(f"튜플 객체의 크기: {sys.getsizeof(t)}") # 튜플 객체의 크기: 88
1.3 패킹과 언패킹
튜플을 만들 때 괄호를 생략하는 것을 여러 개체들을 묶어서 포장한다는 의미에서 패킹 (packing) 이라고 부른다.
t = 1, 2, 3
튜플을 언패킹을 할 수 있는데, 컴마와 대입 연산자를 사용하여 튜플을 언패킹 할 수 있다.
t = 1, 2, 3
x, y, z, = t
print(x) # 1
print(y) # 2
print(z) # 3
이때 튜플이 가지고 있는 아이템의 개수와 언패킹할 때 받아줄 변수의 개수가 맞지 않으면 오류가 발생한다.
t = 1, 2, 3
x, y = t
print(x)
print(y)
# ValueError: too many values to unpack (expected 2)
언패킹을 할 때, 아이템 일부를 사용하지 않을 예정이라면 언더 스코어로 개수만 채우면 된다.
t = 1, 2, 3
x, y, _ = t
참고로 문자열이나 리스트같은 다른 시퀀스에서도 언패킹을 사용할 수 있다.
s = "abc"
s1, s2, _ = s
l = [1, 2, 3]
l1, l2, l3 = l
2. 시퀀스 (Sequence)
문자열, 리스트, 튜플, 범위(range) 등이 시퀀스 자료형으로 분류된다. 아래 연산들은 모든 시퀀스 객체에서 사용될 수 있다. 시퀀스가 아이템들이 나열된 구조라는 것과 연관지으면 직관적으로 이해할 수 있다.
t = (1, 2, 3, 4, 5)
# 1이 t에 포함되어 있는지를 True/False로 리턴.
1 in t
# 1이 t에 포함되어 있지 '않은지'를 True/False로 리턴.
1 not in t
- 인덱싱과 슬라이싱
t = (1, 2, 3, 4, 5)
t[0]
t[1:3]
- len
t = (1, 2, 3, 4, 5)
# 아이템의 개수를 확인할 수 있다.
len(t)
- max, min
t = (1, 2, 3, 4, 5)
# 가장 큰 아이템을 찾아준다.
max(t)
# 가장 작은 아이템을 찾아준다.
min(t)
- index
t = ("A", "B", "C", "D", "E")
# "D"가 들어있는 위치 인덱스를 알려줍니다.
t.index("D")
- count
t = (1, 2, 3, 3, 3, 3, 3, 4, 5)
# 3이 몇 개 들어있는지를 알려줍니다.
t.count(3)