Какие знаешь требования к ключам в словаре Python

Ответ

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

Допустимые типы ключей:

  • Числа (int, float)
  • Строки (str)
  • Кортежи (tuple), если они содержат только неизменяемые элементы
  • frozenset

Недопустимые типы ключей:

  • Списки (list)
  • Множества (set)
  • Словари (dict)
  • Другие изменяемые объекты

Пример:

valid_dict = {
    1: 'number',
    'key': 'string',
    (1, 2): 'tuple'
}

invalid_dict = {
    [1, 2]: 'list'  # TypeError: unhashable type: 'list'
}

Ответ 18+ 🔞

А, слушай, про ключи в питоновских словарях — это вообще отдельная песня, пиздец! Ну то есть, не любая хуйня туда влезет, есть жёсткие правила, блядь.

Короче, ключ должен быть хешируемым и неизменяемым, ёпта. Это как? Ну, у объекта должен быть метод __hash__(), который выдаёт одно и то же число, пока объект живёт, и сам объект меняться не должен. Иначе какой смысл, а? Нашёл ты ключ, а он, сука, форму поменял — и как его теперь искать, блядь? Полный пиздец.

Что можно пихать в ключи, не задумываясь:

  • Циферки всякие (int, float) — они стабильные, блядь.
  • Строки (str) — тоже святые.
  • Кортежи (tuple), но только если внутри у них сидят такие же святые, неизменяемые ублюдки. Если в кортеж сунешь список — всё, пиши пропало.
  • Ну и frozenset, замороженное множество — его тоже не согнёшь.

А что НИ В КОЕМ СЛУЧАЕ нельзя, иначе получишь по ебалу с TypeError:

  • Списки (list) — о, эти шалавки вечно меняются!
  • Множества (set) — такие же шлюхи.
  • Словари (dict) — да они вообще, блядь, эталон непостоянства!
  • Любые другие объекты, которые могут измениться после создания.

Смотри, вот наглядный пиздец:

# Всё чётко, работает
valid_dict = {
    1: 'number',
    'key': 'string',
    (1, 2): 'tuple'  # Кортеж из чисел — красота!
}

# А вот это — НЕТ, БЛЯДЬ! Сейчас влетит!
invalid_dict = {
    [1, 2]: 'list'  # TypeError: unhashable type: 'list'
    # Питон тебе сразу: "Ты чё, мудак, список как ключ? Иди нахуй!"
}

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