Skip to article frontmatterSkip to article content
Site not loading correctly?

This may be due to an incorrect BASE_URL configuration. See the MyST Documentation for reference.

6 튜플

Updated: 18 mrt 2026

튜플은 리스트와 아주 비슷하다. 다만 한 번 생성되면 항목의 추가, 삭제, 변경 등 일체의 수정이 불가능한 불변immutable 자료형이라는 점이 다르다. 무엇보다도 수정을 허용하지 않기에 튜플의 메서드는 몇 개 없다. 또한 튜플의 항목을 활용하는 방법은 리스트의 그것과 동일하다. 예를 들어, 연산, 인덱싱, 슬라싱, for 반복문 활용 등은 리스트의 경우와 완전히 동일하다.

6.1튜플 생성

튜플은 항목들을 소괄호 ()로 감싸고, 각각 항목은 쉼표(,)로 구분된다. 예를 들어, 1부터 5까지의 정수로 구성된 튜플을 가리키는 변수를 다음과 같이 선언한다.

one2five_tuple = (1, 2, 3, 4, 5)

다음 튜플은 영어 알파벳 a부터 c까지로 구성된다.

a2c_tuple = ('a','b', 'c')

소괄호를 생략해도 튜플로 자동 처리된다.

a2c_tuple = 'a','b', 'c'
a2c_tuple
('a', 'b', 'c')

길이가 1인 튜플인 경우 항목 뒤에 반드시 쉽표를 붙혀야 한다.

tup_3 = (3, )
type(tup_3)
tuple

쉼표를 사용하지 않으면 튜플로 간주되지 않을 수 있다. 아래 코드에서 non_tup_3은 3을 포함한 튜플이 아닌 정수 3을 가리킨다.

non_tup_3 = (3)
type(non_tup_3)
int

튜플의 항목으로 여러 종류의 값이 사용될 수 있다. 다음 mixed_tuple은 항목으로 정수, 부동소수점, 문자열, 부울값, 리스트, 튜플을 포함한다.

mixed_tuple = (1, 2.3, 'abc', False, ['ab', 'c'], (2, 4))

아래 코드는 김강현의 정보를 튜플로 선언한다. 항목으로 문자열, 정수, 부동소수점 세 종류가 사용된다.

kgh_tuple = tuple(kgh)
kgh_tuple
('김강현', '010-1234-5678', 20, 172.5, '제주')

빈 튜플

빈 튜플empty tuple은 아무것도 포함하지 않는 튜플을 의미한다. 다음 두 가지 방식으로 빈 튜플을 선언할 수 있다.

  • 방법 1: 소괄호 활용

empty_tuple = ()
  • 방법 2: tuple() 함수 활용

empty_tuple = tuple()

6.2튜플 연산

in 연산자

튜플의 항목으로 등장하는지 여부를 알려주는 논리 연산자이다.

'김강현' in kgh_tuple
True
'서울' in kgh_tuple
False
20 in kgh_tuple
True

이어붙이기/복제

리스트의 경우처럼 튜플도 이어붙이기와 복제 연산을 이용하여 새로운 튜플을 생성할 수 있다. 아래 코드는 김강현과 황현의 정보를 함께 담은 튜플을 생성한다.

whang_tuple = tuple(whang)
whang
['황현', '02-9871-1234', 19, 163.5, '서울']
kgh_tuple + whang_tuple
('김강현', '010-1234-5678', 20, 172.5, '제주', '황현', '02-9871-1234', 19, 163.5, '서울')

아래 코드는 김강현의 정보를 두 번 담은 튜플을 생성한다.

2 * kgh_tuple
('김강현', '010-1234-5678', 20, 172.5, '제주', '김강현', '010-1234-5678', 20, 172.5, '제주')

len()함수

튜플의 길이, 즉 튜플에 포함된 항목의 개수를 반환한다.

len(kgh_tuple)
5
len(2 * kgh_tuple)
10

6.3튜플 인덱싱/슬라이싱

튜플도 문자열과 리스트처럼 인덱싱과 슬라이싱이 가능하다.

kgh_tuple[0]
'김강현'
kgh_tuple[-1]
'제주'
kgh_tuple[::2]
('김강현', 20, '제주')

튜플은 불변 자료형이라 값을 수정할 수 없다. 예를 들어, 김강현의 나이를 21세로 수정하려 시도하면 오류가 발생한다.

kgh_tuple[2]
20
kgh_tuple[2] = 21
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
Cell In[135], line 1
----> 1 kgh_tuple[2] = 21

TypeError: 'tuple' object does not support item assignment

6.4튜플 메서드

튜플 자료형의 메서드는 많지 않다. 많이 사용되는 두 개의 메소드를 살펴보자.

메서드설명
count()지정된 항목이 등장한 횟수 반환
index()지정된 항목이 처음 위치한 인덱스 반환

count() 메서드

아래 코드는 김강현의 정보를 두 번 연속으로 갖고 있는 튜플에서 김강현의 이름이 두 번 사용되었음을 학인해준다.

double_kgh = 2 * kgh_tuple
double_kgh
('김강현', '010-1234-5678', 20, 172.5, '제주', '김강현', '010-1234-5678', 20, 172.5, '제주')
double_kgh.count("김강현")
2

index() 메서드

아래 코드는 김강현의 출생지는 김강현의 정보에서 4번 인덱스에 위치함을 확인해준다.

kgh_tuple.index('제주')
4

6.5순차 자료형 해체

순자 자료형의 항목 각각에 대해 변수 할당을 진행할 수 있다. 단, 사용되는 변수의 수는 항목의 수와 일치해야 한다.

문자열 해체

a, b, c = "123"
print(a)
print(b)
print(c)
1
2
3

a, b, c 각각의 자료형은 문자열이다.

type(a)
str

리스트 해체

아래 코드는 김강현의 정보 각각에 대해 변수를 선언한다.

name, phone, age, height, birth_place = kgh
print(name) 
print(phone) 
print(age)
print(height)
print(birth_place)
김강현
010-1234-5678
20
172.5
제주

튜플 해체

아래 코드는 황현의 정보 각각에 대해 변수를 선언한다.

name, phone, age, height, birth_place = whang_tuple
print(name) 
print(phone) 
print(age)
print(height)
print(birth_place)
황현
02-9871-1234
19
163.5
서울

밑줄 기호 _ 활용

변수의 이름이 굳이 필요 없다면 관용적으로 밑줄underscore(_) 기호 하나로 구성된 변수를 사용한다. 예를 들어, 전화번호와 키 정보가 필요없다면 phoneheight 변수 대신에 밑줄 _ 기호를 사용하는 게 일반적이다.

name, _, age, _, birth_place = kgh
print(name) 
print(age)
print(birth_place)
김강현
20
제주

주의사항

항목의 개수와 변수의 개수가 일치하지 않으면 오류가 발생한다. 오류를 피하려면 위해 밑줄 등을 반드시 활용해야 한다.

name, age, _, birth_place = kgh
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
Cell In[148], line 1
----> 1 name, age, _, birth_place = kgh

ValueError: too many values to unpack (expected 4)

별표 기호 * 활용

앞에 몇 개의 값에만 변수 할당에 사용하고 나머지는 하나의 리스트로 묶어서 퉁쳐버릴 수도 있다. 이를 위해 별표 기호 * 를 하나의 변수명과 함께 사용한다.

name, phone, *etc = whang_tuple
print(name)
print(phone)
print(etc)
황현
02-9871-1234
[19, 163.5, '서울']

나머지 항목들을 무시하고 싶다면, 별표와 밑줄을 함께 사용한다.

name, phone, *_ = whang_tuple
print(name)
print(phone)
황현
02-9871-1234

6.6순차 자료형에 유용한 함수

문자열, 튜플, 리스트처럼 항목들의 순서가 중요한 순차 자료형과 함께 유용하게 사용되는 두 개의 함수를 소개한다.

  • enumerate() 함수

  • zip() 함수

6.6.1enumerate() 함수

튜플과 리스트는 항목들의 인덱스를 바로 제공하지 않는다. 하지만 항목과 해당 항목의 인덱스 정보를 함께 활용해야 할 때가 있는데 이때 enumerate() 함수가 매우 유용하다. 이를 위해 아래 리스트를 이용한다.

some_list = ['foo', 'bar', 'baz', 'pyt', 'thon']

enumerate() 함수는 리스트를 받아서 리스트의 항목과 인덱스를 쌍으로 갖는 enumerate 자료형의 값을 반환한다. 이렇게 반환된 값은 range 자료형의 값처럼 내용을 바로 확인할 수는 없다.

enumerate(some_list)
<enumerate at 0x70231ec97d80>

하지만 리스트로 변환하면 인덱스와 항목의 튜플로 이루어져 있음을 확인 수 있다.

list(enumerate(some_list))
[(0, 'foo'), (1, 'bar'), (2, 'baz'), (3, 'pyt'), (4, 'thon')]

예제

인덱스를 활용하여 원하는 항목만 추출할 수 있다. 예를 들어, 아래 코드는 짝수 인덱스의 값들만 출력하도록 한다. 인덱스와 항목으로 구성된 길이가 2인 튜플을 해체하기 위해 항목의 인덱스를 가리키는 idx 변수와 항목 자체를 가리키는 item 변수를 함께 이용함에 주의하라.

for idx, item in enumerate(some_list):
    if idx % 2 == 0:
        print(item)
foo
baz
thon

enumerate() 함수를 사용하지 않으면서 동일한 기능을 구현하려면 다음과 같이 range() 함수를 이용하여 인덱스에 대해 for 반복문을 이용해야 한다.

for i in range(len(some_list)):
    if i % 2 == 0:
        print(some_list[i])
foo
baz
thon

예제

아래 코드는 인덱스와 리스트의 항목의 순서를 바꾼 튜플의 리스트를 생성한다.

mapping = []

for idx, item in enumerate(some_list):
    mapping.append((item, idx))

mapping
[('foo', 0), ('bar', 1), ('baz', 2), ('pyt', 3), ('thon', 4)]

enumerate() 함수를 사용하지 않으면서 동일한 기능을 구현하려면 인덱스를 직접 이용해야 한다.

mapping = []

for idx in range(len(some_list)):
    mapping.append((some_list[idx], idx))

mapping
[('foo', 0), ('bar', 1), ('baz', 2), ('pyt', 3), ('thon', 4)]

6.6.2zip() 함수

문자열, 리스트, 튜플 등 순차 자료형 여러 개를 묶어 하나의 순차 자료형으로 사용되는 zip 자료형의 값을 반환하며, i 번째 항목은 i 번째 항목들의 튜플로 구성된다.

zip() 함수의 반환값 또한 항목을 바로 확인시켜주지는 않는다.

zip("abc", [1, 2, 3])
<zip at 0x70231eb45580>

반면에 for 반복문을 이용하여 항목을 확인할 수는 있다. 아래 코드는 새로 생성된 값에 포함된 항목이 zip() 함수의 인자 각각에 대해 동일한 인덱스를 갖는 항목들의 튜플로 구성되었음을 잘 보여준다.

for item in zip("abc", [1, 2, 3]):
    print(item)
('a', 1)
('b', 2)
('c', 3)

list로 변환해도 항목을 확인할 수 있다.

list(zip("abc", [1, 2, 3]))
[('a', 1), ('b', 2), ('c', 3)]

zip() 함수의 인자는 3개 이상도 가능하다. 단. 길이가 다르면 가장 짧은 길이에 맞춰서 짝을 짓고, 나머지 항목은 모두 무시한다. 아래 코드는 가장 짧은 [5, 10, 15]에 맞춰서 2번 인덱스까지만 튜플로 묶는다.

list(zip("abcdefgh",(1, 2, 3, 4, 5), [5, 10, 15]))
[('a', 1, 5), ('b', 2, 10), ('c', 3, 15)]

동시 반복

zip() 함수를 이용하면 여러 개의 리스트, 튜플을 대상으로 동시에 반복문을 실행할 수 있다. 아래 코드는 두 개의 리스트에 대해 동시에 반복문을 실행한다.

letters = ['a', 'b', 'c']
numbers = [0, 1, 2]

for l, n in zip(letters, numbers):
    print(f'문자: {l}', end=', ')
    print(f'숫자: {n}')
문자: a, 숫자: 0
문자: b, 숫자: 1
문자: c, 숫자: 2

zip() 함수를 사용하지 않으면 2중으로 중첩된 for 반복문과 인덱싱을 함께 이용해야 한다.

for idx1 in range(len(letters)):
    for idx2 in range(len(numbers)):
        if idx1 == idx2:
            print(f'문자: {letters[idx1]}', end=', ')
            print(f'숫자: {numbers[idx2]}')
문자: a, 숫자: 0
문자: b, 숫자: 1
문자: c, 숫자: 2
letters = ['a', 'b', 'c']
numbers = [0, 1, 2]
operators = ['*', '/', '+']

for l, n, o in zip(letters, numbers, operators):
    print(f'{l} {o} {n}')
a * 0
b / 1
c + 2

zip() 함수를 사용하지 않으면 3중으로 중첩된 for 반복문과 인덱싱을 함께 이용해야 한다.

for idx1 in range(len(letters)):
    for idx2 in range(len(numbers)):
        for idx3 in range(len(operators)):
            if idx1 == idx2 and idx2 == idx3:
                print(f'{letters[idx1]} {operators[idx3]} {numbers[idx2]}')
a * 0
b / 1
c + 2