list — изменяемая последовательность, tuple — неизменяемая последовательность, set — изменяемое множество уникальных хешируемых элементов без гарантированного порядка. list и tuple допускают повторы и индексирование. set используют для проверки принадлежности и операций над множествами. Кортеж хешируем только тогда, когда хешируемы все его элементы.
В чём разница между list, tuple и set в Python?
Изменяемость, порядок, повторы и хешируемость трёх коллекций Python: как выбрать подходящую структуру и не потерять данные.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Выбор зависит прежде всего от смысла данных, а не от предположения, что один контейнер «всегда быстрее».
| Свойство | list | tuple | set |
|---|---|---|---|
| Изменение состава | Да | Нет | Да |
| Сохранение порядка последовательности | Да | Да | Не гарантируется |
| Повторяющиеся элементы | Да | Да | Нет |
| Доступ по индексу | Да | Да | Нет |
| Ограничение на элементы | Произвольные объекты | Произвольные объекты | Хешируемые объекты |
items = [2, 1, 2]
record = (2, 1, 2)
unique = set(items) # множество значений 1 и 2
items.append(3)
unique.add(3)
# record[0] = 9 # TypeError
Список подходит для редактируемого набора с порядком и повторами: например, очереди событий. Кортеж — для фиксированного набора значений, например координат. Множество — для проверки принадлежности, пересечения, объединения и разности.
Неизменяемость кортежа относится к его составу, а не рекурсивно ко всему содержимому:
record = ([1], "label")
record[0].append(2) # допустимо: изменился вложенный список
# hash(record) # TypeError: внутри нехешируемый list
Сам set тоже нехешируем; для неизменяемого множества существует frozenset. Преобразование списка в множество удаляет повторы и не сохраняет контракт порядка, поэтому это не универсальная замена списка. Для membership в обычной хеш-таблице ожидается O(1), но это средняя оценка, не гарантия для каждого входа. Политика равенства тоже важна: например, 1 и True равны и не дадут два разных элемента множества.