Типы данных: кортежи (tuple) в языке Python

Раздел: Типы данных -> Коллекции

Кортеж (tuple) в Python: неизменяемая последовательность

Кортеж - это упорядоченный набор элементов, который, в отличие от списка, нельзя изменить после создания. Это свойство делает кортежи хэшируемыми, что позволяет использовать их в качестве ключей словаря и элементов множества. Кортежи часто применяются для хранения разнородных данных, которые не должны меняться, и для возврата нескольких значений из функции.

Самый распространенный способ создать кортеж - использовать круглые скобки и перечислить элементы через запятую:

coordinates = (55.7558, 37.6176)  # широта и долгота Москвы
print(coordinates)  # (55.7558, 37.6176)

Python set list (set и list в python: различия и использование)

Доступ к элементам выполняется по индексу, начиная с 0:

print(coordinates[0])  # 55.7558
print(coordinates[-1]) # 37.6176

Python пары значений (пары значений в python)

Попытка изменить элемент приведет к ошибке TypeError: 'tuple' object does not support item assignment.

# coordinates[0] = 55.0  # TypeError!

Python object get (метод get для объектов в python)

Главное преимущество кортежей перед списками - их неизменяемость. Это делает код более безопасным, когда нужно гарантировать, что данные не будут случайно изменены. Кортежи занимают меньше памяти и выполняются быстрее при итерации.

Как создать кортеж разными способами?

Кортеж можно создать без скобок, достаточно разделить элементы запятыми:

a = 1, 2, 3  # (1, 2, 3)
b = 'a', 'b' # ('a', 'b')

Python get keys (метод get для словарей в python)

Для создания кортежа из одного элемента необходимо поставить запятую:

single = (5,)  # (5,)
not_tuple = (5) # 5, число, не кортеж

Get index python (метод index в python)

Функция tuple() преобразует итерируемый объект в кортеж:

lst = [1, 2, 3]
print(tuple(lst))  # (1, 2, 3)

Python get methods (методы get в python)

Ошибка: забыть запятую при создании кортежа с одним элементом. Вместо кортежа получится просто число или строка.

Как получить доступ к элементам кортежа и их срезы?

Индексация работает так же, как у списков. Срезы возвращают новый кортеж:

t = (0, 1, 2, 3, 4)
print(t[1:3])  # (1, 2)
print(t[:2])   # (0, 1)
print(t[::2])  # (0, 2, 4)

Python длина списка (длина списка и массива в python)

Если индекс выходит за границы, возникает IndexError.

Попытка изменить элемент после создания кортежа вызывает TypeError. Единственный способ изменить кортеж - создать новый.

Как выполнить распаковку кортежа?

Распаковка (unpacking) позволяет присвоить элементы кортежа переменным:

point = (10, 20)
x, y = point
print(x, y)  # 10 20

словарь данных python (словарь данных в python)

Можно использовать символ * для захвата оставшихся элементов:

a, *rest = (1, 2, 3, 4)
print(a)    # 1
print(rest) # [2, 3, 4]

типы данных python кортеж (кортеж (tuple) в python)

Для игнорирования ненужных значений применяется подчеркивание _:

_, second, _ = (1, 2, 3)
print(second)  # 2

Python типы данных set (множество (set) в python)

Ошибка: несоответствие количества переменных количеству элементов в кортеже (кроме случая с *).

Как использовать кортеж в качестве ключа словаря?

Кортежи могут быть ключами, если все их элементы хэшируемы:

locations = {
    (55.76, 37.62): 'Москва',
    (48.86, 2.35): 'Париж'
}
print(locations[(55.76, 37.62)])  # Москва

Список в качестве ключа использовать нельзя, потому что списки изменяемы и не хэшируются.

Если кортеж содержит изменяемый элемент (например, список), такой кортеж не может быть ключом: TypeError: unhashable type: 'list'.

Как вернуть несколько значений из функции с помощью кортежа?

Функция может возвращать кортеж, который затем распаковывается:

def min_max(lst):
    return min(lst), max(lst)

result = min_max([3, 1, 4, 1, 5])
print(result)  # (1, 5)
low, high = min_max([3, 1, 4, 1, 5])
print(low, high)  # 1 5

Это удобнее, чем возвращать список, когда данные не должны изменяться.

Как использовать именованные кортежи (namedtuple)?

Именованные кортежи (collections.namedtuple) позволяют обращаться к полям по имени:

from collections import namedtuple

Point = namedtuple('Point', ['x', 'y'])
p = Point(3, 4)
print(p.x, p.y)  # 3 4
print(p[0], p[1]) # 3 4 (индексация тоже работает)

Это дает читаемость кода и неизменяемость.

Именованные кортежи все равно являются кортежами: их поля нельзя изменять. Для изменения нужно создать новый экземпляр с помощью _replace().

Дополнительные примеры работы с кортежами

Кортеж как неизменяемый список

Если данные не должны меняться, кортеж предпочтительнее списка. Пример: конфигурационные параметры.

Пример
config = ('localhost', 8080, True)
host, port, debug = config
print(host, port, debug)  # localhost 8080 True
localhost 8080 True

Сравнение кортежей

Кортежи сравниваются поэлементно слева направо.

Пример
a = (1, 2, 3)
b = (1, 2, 4)
print(a < b)   # True (3 < 4)
print(a == (1, 2, 3))  # True
True
True

Использование кортежей в множествах

Кортежи могут быть элементами множества, если они хэшируемы.

Пример
set_of_tuples = {(1, 2), (3, 4), (1, 2)}
print(set_of_tuples)  # {(1, 2), (3, 4)}
{(1, 2), (3, 4)}

Кортеж с изменяемыми элементами (список внутри кортежа)

Сам кортеж неизменяем, но если элемент кортежа изменяем, его можно изменить.

Пример
t = (1, [2, 3], 4)
t[1].append(5)
print(t)  # (1, [2, 3, 5], 4)
(1, [2, 3, 5], 4)

Нельзя заменить сам список на другой объект, но содержимое списка меняется.

Методы кортежей: count и index

Кортеж поддерживает только два метода.

Пример
t = (1, 2, 2, 3, 2)
print(t.count(2))   # 3
print(t.index(3))   # 3 (первое вхождение)
3
3

Преобразование кортежа в список и обратно

Пример
t = (1, 2, 3)
lst = list(t)
lst.append(4)
new_t = tuple(lst)
print(new_t)  # (1, 2, 3, 4)
(1, 2, 3, 4)

Производительность: кортеж быстрее списка при итерации

Пример
import timeit
setup = 'a = tuple(range(1000)); b = list(range(1000))'
print(timeit.timeit('for x in a: pass', setup, number=100000))
print(timeit.timeit('for x in b: pass', setup, number=100000))
0.345
0.456

Кортеж обычно быстрее, хотя разница может быть незначительной.

Именованные кортежи с методами и _replace

Пример
from collections import namedtuple

Person = namedtuple('Person', ['name', 'age', 'city'])
p = Person('Alice', 30, 'Moscow')
print(p._fields)  # ('name', 'age', 'city')
p_new = p._replace(age=31)
print(p_new)      # Person(name='Alice', age=31, city='Moscow')
print(p)          # оригинал не изменился
('name', 'age', 'city')
Person(name='Alice', age=31, city='Moscow')
Person(name='Alice', age=30, city='Moscow')

Кортеж (tuple) в Python - comments

En
типы данных python кортеж (python)