Кортежи или tuples в python
Кортежи неизменяемы. После включения в кортеж элемента (only один раз), он «запекается» и больше не изменяется. По сути, это же списки, но неизменяемые.
(Не существуют tuple comprehensions.)
Создание пустого кортежа
>>> empty_tuple = ()
>>> empty_tuple
()
>>> empty_tuple = tuple()
>>> empty_tuple
()
Создание tuple с одним элементом
>>> one_marx = 'Groucho',
>>> one_marx
('Groucho',)
>>> one_marx = ('Groucho',)
>>> one_marx
('Groucho',)
# Если не указать запятую (,) -> НЕ получится кортеж
>>> one_marx = ('Groucho')
>>> one_marx
'Groucho'
>>> type(one_marx)
<class 'str'>
>>> one_marx = 'Groucho',
>>> type(one_marx)
<class 'tuple'>
>>> type('Groucho',)
<class 'str'>
>>> type(('Groucho',))
<class 'tuple'>
Создание tuple с несколькими элементами
>>> marx_tuple = 'Groucho', 'Chico', 'Harpo'
>>> marx_tuple
('Groucho', 'Chico', 'Harpo')
# ЛУЧШЕ юзать СКОБКИ при присваивании - так кортеж заметнее
>>> marx_tuple = ('Groucho', 'Chico', 'Harpo')
>>> marx_tuple
('Groucho', 'Chico', 'Harpo')
Распаковка кортежей
Можно элементы кортежа присвоить переменным - распаковать кортеж:
>>> marx_tuple = ('Groucho', 'Chico', 'Harpo')
>>> a, b, c = marx_tuple
>>> a
'Groucho'
>>> b
'Chico'
>>> c
'Harpo'
По сути, это тоже самое:
>>> some_word = 'swordfish'
>>> icecream = 'tuttifrutti'
>>> some_word, icecream = icecream, some_word
>>> some_word
'tuttifrutti'
>>> icecream
'swordfish'
tuple()
- преобразование в кортеж
>>> marx_list = ['Groucho', 'Chico', 'Harpo']
>>> tuple(marx_list)
('Groucho', 'Chico', 'Harpo')
Объединение кортежей с помощью оператора +
>>> ('Groucho',) + ('Chico', 'Harpo')
('Groucho', 'Chico', 'Harpo')
Таким образом, кстати, можно “изменять” кортежи (создавать новые):
>>> t1 = ('Fee', 'Fie', 'Foe')
>>> t2 = ('Flop',)
>>> t1 += t2
>>> t1
('Fee', 'Fie', 'Foe', 'Flop')
Кортеж не изменится - создастся новый кортеж и присвоится ему имя t1.
Размножение элементы с помощью оператора *
>>> ('yada',) * 3
('yada', 'yada', 'yada')
Сравнение кортежей
>>> a = (7, 2)
>>> b = (7, 2, 9)
>>> a == b
False
>>> a <= b
True
>>> a < b
True
Что юзать: кортежи или списки?
Хоть у кортежей и меньше возможностей по сравнению со списками (нет функций append(), insert() и т.д., ибо кортеж неизменяемый объект), но:
- Кортежи занимают меньше места
- Безопасность хранимых данных
Нет возможности случайно удалить элементы кортежа- Кортежи работают быстрее
- Можно юзать кортеж в качестве словарных ключей
Алгоритмическая сложность методов кортежа
Доступ к элементу по индексу tuple[index]
- средний случай:
- худший случай:
Доступ к элементу кортежа по индексу всегда выполняется за одно и то же время, поскольку кортеж неизменяем и индекс элемента напрямую связан с его позицией в памяти.
Поиск элемента in
- средний случай:
- худший случай:
Чтобы найти один элемент в кортеже, в худшем случае придётся пройти по всем. В среднем случае нужно будет пройти по половине элементов, но и в этом случае у нас сохранится линейная зависимость от кол-ва элементов в кортеже (чем больше элементов в кортеже, тем больше их и в половине кортежа).
Вставка элемента
- средний случай:
- худший случай:
Вставка элемента требует создания нового кортежа большего размера и копирования всех элементов. А значит, и тут получается линейная зависимость времени выполнения вставки элемента от кол-ва элементов в кортеже.
Удаление элемента
- средний случай:
- худший случай:
Удаление, как и вставка, требует создания нового кортежа без ненужного элемента и копирования всех остальных элементов. Это тоже требует линейного времени.
Соус: Книга “Простой Python” → Глава 7. “Кортежи и списки”