Сравнение структур данных: списки и кортежи в Python
Основные различия между списками и кортежами
Списки (list) и кортежи (tuple) являются встроенными последовательностями в Python, но имеют принципиальное отличие: изменяемость. Список может быть изменен после создания, кортеж - нет. Это влияет на производительность, использование в качестве ключей словаря и доступные методы.
# Создание списка и кортежа
my_list = [1, 2, 3]
my_tuple = (1, 2, 3)
print(type(my_list)) #
print(type(my_tuple)) #
значения списка числа python (итерация по значениям списка чисел в python)
Индексация и срезы работают одинаково, но список поддерживает методы добавления/удаления (append, pop), а кортеж - нет.
# Изменение списка
my_list.append(4) # [1,2,3,4]
my_list[0] = 10 # [10,2,3,4]
# Попытка изменить кортеж вызовет ошибку:
# my_tuple[0] = 10 # TypeError: 'tuple' object does not support item assignment
словарь set python (словарь и set в python)
Типичная ошибка:
При попытке изменить элемент кортежа возникает TypeError. Решение - либо создать новый кортеж, либо использовать список, если требуется изменять данные.
Как создать список или кортеж с одним элементом?
Кортеж с одним элементом требует запятую после значения:
single_list = [1]
single_tuple = (1,) # запятая обязательна
print(type(single_tuple)) #
Python dict set (словарь и множество в python)
Ошибка:
Если запятую опустить ((1)), будет создано целое число, а не кортеж.
В каких случаях кортеж используется как неизменяемый ключ в словаре?
Кортеж может быть ключом словаря, потому что он хешируем (неизменяем). Список использовать нельзя.
my_dict = {('a', 1): 'value'} # кортеж как ключ
# my_dict = {[1,2]: 'value'} # TypeError: unhashable type: 'list'
типы структур python (типы структур данных в python)
Проблема:
Если кортеж содержит изменяемые элементы (например, список), он перестает быть хешируемым.
Как выполнить распаковку последовательности?
Распаковка работает одинаково для списков и кортежей:
a, b, c = [1, 2, 3]
x, y, z = (4, 5, 6)
кортеж чисел python (кортеж чисел в python)
Используется для возврата нескольких значений из функции (обычно кортеж).
Какие методы доступны для списка, но отсутствуют у кортежа?
Список имеет append, extend, insert, remove, pop, sort, reverse и другие. Кортеж - только count и index.
my_list = [3, 1, 2]
my_list.sort()
print(my_list) # [1, 2, 3]
my_tuple = (3, 1, 2)
# my_tuple.sort() # AttributeError
Расширенные примеры работы со списками и кортежами
Сравнение производительности создания и итерации
import timeit
# Создание списка и кортежа
time_list = timeit.timeit(stmt='[1,2,3,4,5]', number=1000000)
time_tuple = timeit.timeit(stmt='(1,2,3,4,5)', number=1000000)
print(f"Список: {time_list:.5f} сек; Кортеж: {time_tuple:.5f} сек")
Список: 0.06234 сек; Кортеж: 0.02345 сек
Кортежи создаются быстрее благодаря меньшему объему памяти.
Использование кортежа как аргумента функции с распаковкой
def sum_three(a, b, c):
return a + b + c
values = (10, 20, 30)
result = sum_three(*values) # распаковка кортежа
print(result) # 60
Вложенные структуры и изменяемость элементов кортежа
tuple_with_list = ([1, 2], 'text')
tuple_with_list[0].append(3) # изменяем список внутри кортежа
print(tuple_with_list) # ([1, 2, 3], 'text')
# Сам кортеж остается неизменным, но содержимое списка меняется
Преобразование между списком и кортежем
my_list = [4, 5, 6]
converted_tuple = tuple(my_list)
print(converted_tuple) # (4, 5, 6)
my_tuple = (7, 8, 9)
converted_list = list(my_tuple)
print(converted_list) # [7, 8, 9]
Срез и копирование
original_list = [0, 1, 2, 3, 4]
sliced_list = original_list[1:3]
print(sliced_list) # [1, 2]
original_tuple = (0, 1, 2, 3, 4)
sliced_tuple = original_tuple[1:3]
print(sliced_tuple) # (1, 2)
# Срез создает новый объект, для списка это поверхностная копия
Множественное присваивание с использованием кортежа (и списка)
point = (10, 20)
x, y = point
print(f"x={x}, y={y}")
# Обмен значений без временной переменной
a, b = 1, 2
a, b = b, a
print(a, b) # 2 1
Генераторы списков и кортежей
squares_list = [x**2 for x in range(5)]
print(squares_list) # [0, 1, 4, 9, 16]
# Для кортежа нет литерала генератора, нужно явное преобразование
squares_tuple = tuple(x**2 for x in range(5))
print(squares_tuple) # (0, 1, 4, 9, 16)
Использование кортежей в качестве констант и для иммутабельных данных
DAYS_OF_WEEK = ('Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday')
# Попытка изменить кортеж невозможна, что защищает данные от случайного изменения