튜플 개념 및 특징

매일 공부(ML)·2022년 2월 21일
0

Intro

튜플과 리스트의 차이를 이해하고, 튜플의 특성을 활용해 문제를 해결할 수 있다.

저번 블로그에는 파이썬의 강력한 컬렉션인 딕셔너리에 대해 배웠는데요, 리스트와 비슷하지만 또 다른 특성을 갖고 있는 튜플에 대해 알아보겠습니다.

먼저 튜플과 비슷한 리스트와의 공통점과 차이점에 대해 알아보고, 튜플의 특성을 어떤 상황에서 활용할 수 있는지 간단히 살펴보겠습니다.


리스트(List)와 비슷한 컬렉션, 튜플(Tuple)

튜플은 리스트와 굉장히 비슷합니다.

다음 코드를 보시면 리스트와의 차이는 단지 대괄호 대신 소괄호를 사용했다는 정도라는 것을 알 수 있습니다.
리스트와 같이 순서가 있어서 인덱스로 접근이 가능하고, 최대값도 찾을 수 있습니다.

x = ('Glenn', 'Sally', 'Joseph')
print(x[2])
# Joseph
y = ( 1, 9, 2 )
print(y)
# (1, 9, 2)
print(max(y))
# 9

뿐만 아니라, for 반복문에서 반복을 시키면 리스트와 같이 원소를 순서대로 출력해줍니다.

for iter in y :
    print(iter)
# 1
# 9
# 2
 

변경 불가능한 속성 (immutable)

하지만 리스트와 큰 차이가 있는데, 그것은 변경불가능(immutable), 즉 값을 변경할 수 없다는 특성입니다.

예를 들면, 리스트에서는 다음과 같이 원소의 값을 변경할 수 있습니다.

x = [9, 8, 7]
x[2] = 6
print(x)
# [9, 8, 6]

하지만 다음과 같이 튜플일 경우에는 오류가 발생합니다.
그 이유가 바로 변경 불가능한 속성 때문입니다.

x = (9, 8, 7)
x[2] = 6
print(x)

# ---------------------------------------------------------------------------
# TypeError                                 Traceback (most recent call last)
# <ipython-input-4-6136e7d6cb90> in <module>()
#       1 x = (9, 8, 7)
# ----> 2 x[2] = 6
#       3 print(x)
# 
# TypeError: 'tuple' object does not support item assignment

이런 변경 불가능한 속성 때문에 튜플은 리스트보다 훨씬 더 효율적으로 동작합니다. 용량도 적게 차지하고, 접근도 훨씬 빠릅니다.

물론, 이런 특성으로 인해 리스트에서 할 수 있는 일을 하지 못하는 경우도 있습니다.

다음 코드를 보시면, 한 번 생성된 튜플은 정렬하거나, 값을 추가하거나, 순서를 바꿀 수 없습니다.

x = (3, 2, 1)
x.sort()
# Traceback:
# AttributeError: 'tuple' object has no attribute 'sort'
x.append(5)
# Traceback:
# AttributeError: 'tuple' object has no attribute 'append'
x.reverse()
# Traceback:
# AttributeError: 'tuple' object has no attribute 'reverse'

이외에도 리스트에서 할 수 있는 것 중 값을 변경하는 것들은 튜플에서 할 수 없습니다.

구체적으로 리스트에 내장된 함수와 튜플에 내장된 함수를 비교하면 다음과 같습니다.


 l = list()
 dir(l)
# ['append', 'count', 'extend', 'index', 'insert', 'pop', 'remove', 'reverse', 'sort']

 t = tuple()
 dir(t)
# ['count', 'index']

즉, 값을 변경하지 않아도 되는 count, index와 같은 함수만 작동하는 것입니다.


튜플의 장점

임시 변수로 활용

이런 변경이 되지는 않는 속성으로 인해 튜플은 파이썬에서 더 효율적으로 동작됩니다.

하지만 이런 특성은 입문하는 사람에들에겐 큰 장점이 아닐 수 있습니다. 그러면 튜플은 언제 사용하면 좋을까요?

튜플을 다음과 같이 좌변에 사용하면 간단하게 여러 변수에 값을 넣을 수 있습니다.

단, 이럴 경우 좌변과 우변의 갯수는 일치해야합니다.

(x, y) = (4, 'fred')
print(y)
# fred
(a, b) = (99, 98)
print(a)
# 99
  

이와 같은 특성을 잘 활용하면 함수에서 여러 개의 값을 한꺼번에 반환할 수도 있습니다.

def t() :
    return (10, 20)
x, y = t()
print(x, y)

# 10 20

한 가지 팁은, 소괄호를 사용하지 않아도 컴마로 여러 값을 나열하면 파이썬에서는 튜플로 인식하기 때문에 다음과 같이 간단히 사용할 수도 있습니다.


x, y = 1, 10
print(x, y)
# 1 10

x, y = y, x
print(x, y)
# 10 1

### 딕셔너리를 처리하는데 활용

지난 시간에 잠시 보셨던 것처럼 딕셔너리의 items 메소드는 딕셔너리에 저장된 각 키와 값의 한 쌍을 튜플로 이루어진 리스트 형태로 만들어줍니다.

따라서 다음과 같이 사용할 수도 있습니다.

d = dict()
d['csev'] = 2
d['cwen'] = 4
for (k,v) in d.items(): 
    print(k, v)
# csev 2
# cwen 4

tups = d.items()
print(tups)
# dict_items([('csev', 2), ('cwen', 4)])

여러 값에 대해 비교 가능

튜플의 또다른 장점은 여러 값에 대해 비교가 가능하다는 점입니다.

비교의 방법은 각 튜플의 가장 왼쪽 값끼리 비교한 후 둘의 값이 다를 경우에는 나머지 값들을 비교하지 않고 큰지 작은지 여부를 판단합니다.

만약 가장 왼쪽 값이 동일할 경우에는 그 다음 값을 비교하고, 그 값도 같으면 또 다음 값을 비교하는 형태로 비교가 진행됩니다.

 (0, 1, 2) < (5, 1, 2)
# True 값을 가집니다.
 (0, 1, 2000000) < (0, 3, 4)
# True 값을 가집니다.
 ( 'Jones', 'Sally' ) < ('Jones', 'Sam')
# True 값을 가집니다.
 ( 'Jones', 'Sally') > ('Adams', 'Sam')
# True 값을 가집니다.
profile
성장을 도울 아카이빙 블로그

0개의 댓글