tuple в скриптах: работа с фиксированными последовательностями

Раздел: Типы данных -> Кортежи

Тип tuple: неизменяемая упорядоченная последовательность

Кортеж в Python представляет собой коллекцию элементов, у которой нельзя менять состав и порядок после создания. В отличие от списка tuple хранит ссылки на объекты и не позволяет добавлять или удалять записи. За эту неизменность кортеж часто применяется для фиксированных наборов данных, ключей словаря и возврата нескольких значений из функции.

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

colors = ('красный', 'зеленый', 'синий')
print(colors)
print(type(colors))

Python тип кортеж (тип кортеж (tuple) в python)

('красный', 'зеленый', 'синий')
<class 'tuple'>

Для пустого кортежа используются пустые скобки (). Для кортежа с одним элементом обязательна запятая, иначе Python интерпретирует выражение как строку или число:

empty = ()
single = (42,)
without_comma = (42)
print(type(empty))
print(type(single))
print(type(without_comma))
<class 'tuple'>
<class 'tuple'>
<class 'int'>

Индексация кортежа работает так же, как у строк и списков. Нумерация начинается с нуля, отрицательный индекс означает отсчет от конца кортежа:

point = (3, 7, 11)
print(point[0])
print(point[-1])
3
11

Проверка вхождения и длина кортежа выполняются операторами in, len():

person = ('Иван', 28)
print('Иван' in person)
print(len(person))
True
2

Создание кортежа с помощью функции tuple()

Как конвертировать список, строку или другое итерируемое значение в кортеж?

Функция tuple(iterable) принимает любой итерируемый объект и возвращает новый кортеж из его элементов. Это удобно для защиты данных от случайных изменений или для подготовки к использованию в качестве ключа словаря.

list_values = [1, 4, 9]
coords = tuple(list_values)
word_symbols = tuple('код')
range_values = tuple(range(4))
print(coords)
print(word_symbols)
print(range_values)
(1, 4, 9)
('к', 'о', 'д')
(0, 1, 2, 3)

Упаковка кортежа без круглых скобок

Можно ли записать кортеж без использования скобок?

Python позволяет создавать кортеж простым перечислением значений через запятую. Такая запись называется упаковкой кортежа и часто применяется для обмена значениями или присваивания нескольких переменных.

pair = 'left', 'right'
print(pair)
x, y = pair
print(x)
print(y)
('left', 'right')
left
right

Обмен двух переменных без временной переменной использует эту же особенность:

a = 5
b = 10
a, b = b, a
print(a, b)
10 5

Распаковка с сохранением остатка

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

Синтаксис со звездочкой * в левой части присваивания собирает неограниченное количество элементов в список. Распаковка проходит по всем составляющим кортежа.

numbers = (1, 2, 3, 4, 5)
first, *middle, last = numbers
print(first)
print(middle)
print(last)
1
[2, 3, 4]
5

Переменная, помеченная звездочкой, всегда содержит список, даже если элементов оказалось несколько или один.

Встроенные методы count и index

Каким образом считается количество повторений значения в кортеже и находится его позиция?

У кортежа доступны всего два метода. Метод count(value) возвращает число вхождений переданного объекта, а метод index(value) возвращает индекс первого вхождения. Если значения нет, метод index вызовет исключение ValueError.

measurements = (2, 5, 2, 8, 2)
print(measurements.count(2))
print(measurements.index(8))
3
3

Срезы, сложение и умножение кортежей

Каким способом создается новый кортеж из части старого, двух кортежей или повторяющихся элементов?

Операции со срезами не изменяют исходный кортеж, а создают новый. Сложение кортежей конкатенирует два набора элементов. Умножение на целое число повторяет последовательность несколько раз.

base = (0, 1, 2, 3, 4, 5)
part = base[1:5]
combine = (10, 20) + (30,)
repeat = ('ab',) * 3
print(part)
print(combine)
print(repeat)
(1, 2, 3, 4)
(10, 20, 30)
('ab', 'ab', 'ab')

Вложенные кортежи и многомерный доступ

Как хранить таблицу или матрицу, используя кортеж кортежей, и обратиться к конкретной ячейке?

Кортеж может содержать другие кортежи. Тогда доступ к внутренним элементам записывается последовательно: сначала индекс внешнего кортежа, затем индекс вложенного кортежа.

matrix = (
    (1, 2, 3),
    (4, 5, 6),
)
print(matrix[0][1])
print(matrix[1][2])
2
6

Такой подход применяется для небольших табличных данных, которые не должны изменяться в процессе работы программы.

Сложности неизменности и изменяемые объекты внутри кортежа

Типичная ошибка начинает появляться при попытке присвоить новое значение элементу кортежа. Интерпретатор сообщает об ошибке TypeError. Сам кортеж остается прежним.

tuple_fixed = (100, 200)
tuple_fixed[0] = 0
TypeError: 'tuple' object does not support item assignment

Важно учитывать, что кортеж хранит ссылки на объекты. Если внутри кортежа находится изменяемый список, содержимое этого списка можно модифицировать. Замена самого списка другим списком будет запрещена.

container = ([1, 2], 'text')
container[0].append(3)
print(container)
container[0] = [9]
([1, 2, 3], 'text')
TypeError: 'tuple' object does not support item assignment

Еще одна частая трудность возникает при создании кортежа из одного элемента без запятой. Для кортежа нужно всегда ставить завершающую запятую, даже внутри других операций.

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

Как изменить элементы кортежа, если это все-таки необходимо?

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

fruits = ('яблоко', 'груша', 'слива')
fruits_list = list(fruits)
fruits_list.append('персик')
fruits = tuple(fruits_list)
print(fruits)
('яблоко', 'груша', 'слива', 'персик')

Расширенные примеры использования tuple в Python

В этом разделе собраны развернутые примеры кода с результатами и пояснениями.

Именованный кортеж namedtuple

Класс namedtuple из модуля collections создает подкласс tuple. Элементам такого кортежа можно давать имена, при этом сохраняется обычная индексация и распаковка.

Пример
from collections import namedtuple

Car = namedtuple('Car', ['mark', 'year', 'color'])
auto = Car('Lada', 2020, 'white')
print(auto)
print(auto.mark)
print(auto[1])
Car(mark='Lada', year=2020, color='white')
Lada
2020

Кортеж как ключ словаря

Каким образом кортеж из координат используется для поиска значения в словаре?

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

Пример
geo = {(55.7558, 37.6173): 'Москва', (59.9343, 30.3351): 'Санкт-Петербург'}
print(geo[(55.7558, 37.6173)])
print(len(geo))
Москва
2

Возврат нескольких значений из функции

Как функция возвращает сразу несколько результатов в виде одного кортежа?

Функция, которая вычисляет несколько независимых значений, может вернуть их одним кортежем. Вызывающая сторона распаковывает результат в переменные.

Пример
def split_text(text):
    parts = text.split()
    return len(parts), ' '.join(parts).upper(), parts[0]

count, upper_text, first_word = split_text('один два три')
print(count)
print(upper_text)
print(first_word)
3
ОДИН ДВА ТРИ
один

Сортировка кортежа с сохранением исходного порядка

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

Функция sorted возвращает список. Исходный кортеж остается без изменений, а отсортированные элементы доступны в новом объекте.

Пример
scores = (42, 7, 19, 3)
ascending = sorted(scores)
descending = sorted(scores, reverse=True)
print(ascending)
print(descending)
print(scores)
[3, 7, 19, 42]
[42, 19, 7, 3]
(42, 7, 19, 3)

Генераторное выражение с tuple()

Как создать кортеж из значений, полученных в цикле, без промежуточного списка?

Внутри tuple можно передать генераторное выражение. Оно вычисляет элементы по одному и наполняет новый кортеж результатом.

Пример
cubes = tuple(x ** 3 for x in range(1, 5))
print(cubes)
(1, 8, 27, 64)

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

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

Метод items у словаря возвращает представление пар. Передача этого представления в tuple создает кортеж, где каждый элемент тоже является кортежем.

Пример
inventory = {'pen': 3, 'pencil': 5}
items_tuple = tuple(inventory.items())
print(items_tuple)
(('pen', 3), ('pencil', 5))

Функция zip с переводом результата в кортеж

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

Функция zip попарно объединяет элементы двух последовательностей. Объект zip требуется преобразовать в кортеж, чтобы увидеть готовые пары.

Пример
letters = ('a', 'b', 'c')
digits = (1, 2, 3)
pairs = tuple(zip(letters, digits))
print(pairs)
(('a', 1), ('b', 2), ('c', 3))

Разворот кортежа

Как получить элементы кортежа в обратном порядке?

Встроенная функция reversed возвращает итератор. Оборачивание этого итератора в tuple создает новый кортеж с элементами в обратном направлении.

Пример
straight = (1, 2, 3)
print(tuple(reversed(straight)))
(3, 2, 1)

Проверка any и all на кортеже

Как проверить, соблюдается ли условие хотя бы для одного элемента или для всех элементов?

Функции any и all принимают итерируемый объект. Вместе с генераторным выражением они дают компактный способ проверки кортежа.

Пример
numbers = (4, 8, 15, 16, 23)
print(any(x > 10 for x in numbers))
print(all(x > 10 for x in numbers))
True
False

Сравнение кортежей по элементам

Каким образом Python сравнивает два кортежа между собой?

Кортежи сравниваются лексикографически. Сначала сравниваются первые элементы, при равенстве сравниваются вторые и так далее.

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

Сумма, минимум и максимум

Как вычислить агрегированные значения по элементам кортежа?

Функции min, max и sum встроены в Python и принимают итерируемый кортеж без дополнительной подготовки.

Пример
population = (5, 12, 7, 9)
print(min(population))
print(max(population))
print(sum(population))
5
12
33

Хэширование и неизменяемость

Почему кортеж можно использовать в множестве и словаре, если он состоит из неизменяемых объектов?

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

Пример
print(hash((1, 2)) == hash((1, 2)))
try:
    hash((1, [2], 3))
except TypeError as error:
    print(error)
True
unhashable type: 'list'

Вложенная распаковка

Как распаковать кортеж, внутри которого находятся другие кортежи?

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

Пример
company = (('Иванов', 'Иван'), 35, 'разработчик')
(surname, name), age, profession = company
print(surname)
print(name)
print(age)
print(profession)
Иванов
Иван
35
разработчик

Передача кортежа как набора аргументов

Как передать элементы кортежа в функцию как отдельные позиционные аргументы?

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

Пример
def add(a, b, c):
    return a + b + c

args = (2, 4, 6)
print(add(*args))
12

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

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

Функция enumerate создает пары из индекса и очередного элемента. Такой способ полезен при обходе кортежа с необходимостью знать порядковый номер.

Пример
months = ('январь', 'февраль', 'март')
for index, value in enumerate(months):
    print(index, value)
0 январь
1 февраль
2 март

Циклический сдвиг элементов кортежа

Каким образом переместить часть кортежа в начало или конец без изменения исходного объекта?

С помощью срезов можно выполнить циклический сдвиг. Сложение двух полученных срезов создает новый кортеж с переставленными элементами.

Пример
def rotate(seq, n):
    return seq[n:] + seq[:n]

items = (10, 20, 30, 40)
print(rotate(items, 2))
(30, 40, 10, 20)

Тип кортеж (tuple) в Python - comments

En
Python тип кортеж (python)