Создание
a = (1, 2, 3)b = 1, 2, 3c = (1,)d = ()e = tuple([1, 2, 3])f = tuple("abc")print(type((1)))print(type((1,)))Кортеж определяется запятыми, а не скобками. Для одного элемента запятая обязательна.
Операции
t = (10, 20, 30, 40)print(t[0], t[-1])print(t[1:3])print(len(t))print(20 in t)print(t + (50,))print(t * 2)print((1, 2) < (1, 3))print(max(t), min(t), sum(t))Методы tuple
У кортежа всего два метода:
| Метод | Описание |
|---|---|
count(x) | Количество вхождений |
index(x[, start, end]) | Индекс первого вхождения, иначе ValueError |
t = (1, 2, 2, 3)print(t.count(2))print(t.index(3))Неизменяемость
Нельзя заменить, добавить или удалить элементы:
t = (1, 2, 3)try: t[0] = 10except TypeError as e: print(e)Но если внутри кортежа лежит изменяемый объект, его содержимое можно менять:
t = ([1, 2], 3)t[0].append(99)print(t)Хешируемость
Кортеж хешируем, если хешируемы все его элементы, поэтому подходит в качестве ключа словаря и элемента множества:
grid = {(0, 0): "start", (1, 2): "finish"}print(grid[(1, 2)])seen = {(1, 2), (3, 4)}print((1, 2) in seen)print(hash((1, 2)))Распаковка
x, y = (1, 2)a, *rest = (1, 2, 3, 4)first, *mid, last = (1, 2, 3, 4, 5)(p, q), r = (1, 2), 3x, y = y, xОбмен значений через x, y = y, x работает потому, что правая часть сначала собирается в кортеж.
Возврат нескольких значений
def stats(items): return min(items), max(items), sum(items) / len(items)low, high, avg = stats([3, 5, 7])print(low, high, avg)namedtuple
Кортеж с именами полей:
from collections import namedtuplePoint = namedtuple("Point", ["x", "y"])p = Point(3, 4)print(p)print(p.x, p[1])print(p._asdict())print(p._replace(x=10))print(Point._fields)x, y = p| Элемент | Описание |
|---|---|
_fields | Кортеж имён полей |
_asdict() | Преобразование в словарь |
_replace(**kwargs) | Копия с изменёнными полями |
_make(iterable) | Классовый метод: создание из последовательности |
_field_defaults | Значения по умолчанию |
typing.NamedTuple
Тот же тип с аннотациями и методами:
from typing import NamedTupleclass Point(NamedTuple): x: float y: float = 0.0 def dist(self): return (self.x ** 2 + self.y ** 2) ** 0.5print(Point(3, 4).dist())Когда использовать кортеж, а когда список
| Кортеж | Список |
|---|---|
| Неизменяемая запись из разнородных полей | Однородная коллекция переменной длины |
| Ключ словаря, элемент множества | Данные, которые нужно менять |
| Возврат нескольких значений | Накопление результата |
| Немного меньше памяти и быстрее создание | Больше гибкости |
Задания
- Сохраните координаты городов в словаре с ключами-кортежами и найдите ближайший к заданной точке.
- Опишите запись «студент» через
NamedTupleи отсортируйте список по среднему баллу. - Объясните, почему
t = ([], 1); t[0] += [1]вызывает ошибку, но список всё равно изменяется.
