Кортежи или 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() и т.д., ибо кортеж неизменяемый объект), но:

  1. Кортежи занимают меньше места
  2. Безопасность хранимых данных
    Нет возможности случайно удалить элементы кортежа
  3. Кортежи работают быстрее
  4. Можно юзать кортеж в качестве словарных ключей

Алгоритмическая сложность методов кортежа

Доступ к элементу по индексу tuple[index]

  • средний случай: $O(1)$
  • худший случай: $O(1)$
    Доступ к элементу кортежа по индексу всегда выполняется за одно и то же время, поскольку кортеж неизменяем и индекс элемента напрямую связан с его позицией в памяти.

Поиск элемента in

  • средний случай: $O(n)$
  • худший случай: $O(n)$
    Чтобы найти один элемент в кортеже, в худшем случае придётся пройти по всем. В среднем случае нужно будет пройти по половине элементов, но и в этом случае у нас сохранится линейная зависимость от кол-ва элементов в кортеже (чем больше элементов в кортеже, тем больше их и в половине кортежа).

Вставка элемента

  • средний случай: $O(n)$
  • худший случай: $O(n)$
    Вставка элемента требует создания нового кортежа большего размера и копирования всех элементов. А значит, и тут получается линейная зависимость времени выполнения вставки элемента от кол-ва элементов в кортеже.

Удаление элемента

  • средний случай: $O(n)$
  • худший случай: $O(n)$
    Удаление, как и вставка, требует создания нового кортежа без ненужного элемента и копирования всех остальных элементов. Это тоже требует линейного времени.

Соус: Книга “Простой Python Глава 7. “Кортежи и списки

python