[Python101] Iterable(3) – 튜플

튜플(tuple)은 ‘한 벌’의 의미로 의미상으로는 가장 원시적인 배열이다. 튜플 한 번 만들어지고 나면 수정이 불가능한 집합이다. 쉽게 말해서 리스트를 ‘얼리면’ 튜플이 된다.

튜플을 만드는 법

리스트를 정의할 때는 대괄호에 원소들을 써서 생성했다. 튜플의 경우에는 괄호에 원소들을 써서 만들 수 있다. 아래의 b는 터플이다.

a = [1, 2, 3, 4]
b = (1, 2, 3, 4)

터플의 원소는 리스트와 마찬가지의 방법으로 접근할 수 있다. 터플 이름 뒤에 대괄호를 쓰고 그 속에 인덱스를 넣으면 된다.

b[2] # --> 3
b[:2] # --> (1, 2)

재밌는 사실 하나. 원소가 하나 밖에 없는 튜플을 만드려면 어떻게 해야할까? (1)이라고 쓰면 이는 수식 자체로 숫자 1과 아무런 차이가 없다. 대신 (1, ) 이라고 쓰면 이는 숫자 1을 원소로 갖는 튜플이 된다.

튜플의 메소드

튜플은 count, index의 두 개의 메소드만 제공한다. 튜플의 특정한 원소를 변경하거나, append, remove, pop, insert 등의 기능은 수행할 수 없다.

그러면 이렇게 한정적인 기능만을 수행하는 튜플을 왜 사용할까? 리스트의 경우 한 번 만들어진 이후에 변경이 가능한 점 때문에 처리하는 데 ‘속도’가 느려질 수 있다. 매우 큰 집합을 포함하는 리스트의 중간에 새로운 원소를 끼워넣거나, 중간에 있는 특정한 원소를 제거하는 것은 제아무리 빠른 컴퓨터라할지라도 꽤나 피곤한 일인 것이다. 이런 “변경 가능한 특성” 때문에 리스트는 편리한 대신 처리속도가 느리다. 튜플은 변경 가능한 특성이 없고 오직 고정되어 있는 리스트이기 때문에 원소를 검색하거나 하는 데 시간이 거의 걸리지 않는다.

사실 리스트를 이해하면 튜플은 그냥 이해하고 있는 것과 다름없다. 원소를 변경하거나 정렬하는 등의 동작을 할 수 없지만 그냥 무식하게 빠르다고 생각하면 된다.

길이를 구하거나 정렬하기 – 내장함수의 경우

튜플은 변경과 관련된 메소드를 가지고 있지 않지만, 대신 기본 내장 함수들 sorted(), len()에서는 적용할 수 있다. 즉 (2,5,7,3,4,1,9)와 같은 튜플은 sorted() 함수를 써서 ‘정렬된 리스트’를 얻을 수는 있다.

b = (2,6,3,7,4,1,9)
c = sorted(b)
print c
# --> (1, 2, 3, 4, 6, 7, 9)

튜플의 이름은 역시 자료형인 동시에 튜플로 변환하는 함수이기도 하다. tuple() 함수는 리스트를 얼리거나, 문자열을 쪼개어 터플로 만들어준다.

>>> a = 'attributes'
>>> b = range(0,10,4)
>>> ta = tuple(a)
>>> tb = tuple(b)
>>> ta
# --> ('a', 't', 't', 'r', 'i', 'b', 'u', 't', 'e', 's')
>> > tb
# --> (0, 4, 8)
>>> len(ta)
# --> 10
>>> sorted(ta)
# --> ['a', 'b', 'e', 'i', 'r', 's', 't', 't', 't', 'u']

이제 다음 시간에는 다른 자료형인 ‘사전(dictionary)’에 대해 알아보기로 하겠다. 사전형은 이름이 있는 원소들을 다루는 멋진 자료형이다.