Кортежи или tuples в python
Кортежи неизменяемы. После включения в кортеж элемента (only один раз), он «запекается» и больше не изменяется. По сути, это же списки, но неизменяемые.
(Не существуют tuple comprehensions.)
Создание пустого кортежа
Создание tuple с одним элементом
Создание tuple с несколькими элементами
Распаковка кортежей
Можно элементы кортежа присвоить переменным - распаковать кортеж:
По сути, это тоже самое:
tuple()
- преобразование в кортеж
Объединение кортежей с помощью оператора +
Таким образом, кстати, можно “изменять” кортежи (создавать новые):
Кортеж не изменится - создастся новый кортеж и присвоится ему имя t1.
Размножение элементы с помощью оператора *
Сравнение кортежей
Что юзать: кортежи или списки?
Хоть у кортежей и меньше возможностей по сравнению со списками (нет функций append(), insert() и т.д., ибо кортеж неизменяемый объект), но:
- Кортежи занимают меньше места
- Безопасность хранимых данных
Нет возможности случайно удалить элементы кортежа- Кортежи работают быстрее
- Можно юзать кортеж в качестве словарных ключей
Алгоритмическая сложность методов кортежа
Доступ к элементу по индексу tuple[index]
- средний случай: $O(1)$
- худший случай: $O(1)$
Доступ к элементу кортежа по индексу всегда выполняется за одно и то же время, поскольку кортеж неизменяем и индекс элемента напрямую связан с его позицией в памяти.
Поиск элемента in
- средний случай: $O(n)$
- худший случай: $O(n)$
Чтобы найти один элемент в кортеже, в худшем случае придётся пройти по всем. В среднем случае нужно будет пройти по половине элементов, но и в этом случае у нас сохранится линейная зависимость от кол-ва элементов в кортеже (чем больше элементов в кортеже, тем больше их и в половине кортежа).
Вставка элемента
- средний случай: $O(n)$
- худший случай: $O(n)$
Вставка элемента требует создания нового кортежа большего размера и копирования всех элементов. А значит, и тут получается линейная зависимость времени выполнения вставки элемента от кол-ва элементов в кортеже.
Удаление элемента
- средний случай: $O(n)$
- худший случай: $O(n)$
Удаление, как и вставка, требует создания нового кортежа без ненужного элемента и копирования всех остальных элементов. Это тоже требует линейного времени.
Соус: Книга “Простой Python” ⇒ Глава 7. “Кортежи и списки”