Может ли кортеж (tuple) быть ключом словаря в Python?

Ответ

Да, может. Ключом словаря в Python может быть любой хешируемый (hashable) и, следовательно, неизменяемый (immutable) объект. Кортеж удовлетворяет этому требованию.

Пример:

my_dict = {}
key_tuple = (1, 2, 3)
my_dict[key_tuple] = "Значение"
print(my_dict)  # Вывод: {(1, 2, 3): 'Значение'}

Важное исключение: Кортеж, содержащий хотя бы один изменяемый элемент (например, список), теряет свойство хешируемости и не может быть ключом.

invalid_key = (1, [2, 3])
my_dict[invalid_key] = "Ошибка"  # Вызовет TypeError: unhashable type: 'list'

Ответ 18+ 🔞

А, слушай, вот тебе загадка на ночь: можно ли в питоновский словарь ключом запихнуть кортеж? Ну, типа, вот этот (1, 2, 3)?

Так вот, блядь, да, можно, ебать мои старые костыли! Но с одной охуенно важной оговоркой, которую все просрать норовят.

Смотри, питон — он не дурак, ему для ключа нужен объект, который хешируется, то есть по нему можно уникальный цифровой отпечаток получить. А значит, он должен быть неизменяемым. Кортеж-то как раз подходит, он вроде как замороженный список, его не перепишешь.

Вот, смотри, как это работает, на живом примере:

my_dict = {}
key_tuple = (1, 2, 3)
my_dict[key_tuple] = "Значение"
print(my_dict)  # Вывод: {(1, 2, 3): 'Значение'}

Видишь? Записалось, всё чётко. (1, 2, 3) стал ключом.

А теперь ловушка, в которую все попадают, ёпта! Представь, что внутри кортежа затесался какой-нибудь изменяемый ублюдок, например, список.

invalid_key = (1, [2, 3])  # Смотри-ка, второй элемент — список, сука!
my_dict[invalid_key] = "Ошибка"  # А вот тут будет: TypeError: unhashable type: 'list'

И всё, пиздец, накрылся медным тазом! Интерпретатор тебе так и скажет: «Ты чё, мудак? Ты мне сюда изменяемую хуйню суёшь? Я ж не могу посчитать хеш от того, что может поменяться!». И будет прав, блядь.

Так что да, кортеж — ключом быть может, но только если он чистый, без этих ваших списков внутри. Иначе — ни хуя себе сюрприз.