Если вам нужно использовать целую комбинацию от key1
до keyn
, чтобы получить value
, вы можете перевернуть диктовку, как я предложил ниже для O (nk * nv) (количество ключей * количество значений) или используйте метод tuple
выше.
Предполагая, что вам нужно построить tuple
при вставке, и снова, когда вам нужно получить значение, оба будут O (nk), где nk
- количество ключей.
Вложенная версия dict
может быть более компактной, если вы вложены достаточно глубоко (есть много значений, которые разделяют частично упорядоченный список ключей), и получение значения все равно будет O (nk), но вероятно, медленнее, чем версия кортежа.
Однако вставка будет медленнее, хотя я не могу измерить ее скорость. Вам нужно будет создать как минимум один слой из dict
для каждой вставки и проверить наличие
dict
с на предыдущих уровнях.
Существует много рецептов для рекурсивных defaultdict
с, которые упростили бы вставку с точки зрения кодирования, но на самом деле это не ускорило бы.
Метод tuple
проще и быстрее для вставки, но может занять больше памяти в зависимости от вашего вложения.
Оригинальный ответ, прежде чем я знал требования
Почему бы не
{'key1' : 'value', 'key2' : 'value', .... 'keyn' : 'value' }
Он просто хранит ссылку на value
в каждом месте, а не value
, поэтому использование памяти будет на меньше , чем у вложенной версии dict
, и не намного больше, чем * Версия 1043 *, если только у вас не слишком большое число value
с.
Временную сложность операций стандартного типа Python см. В вики Python .
Обычно вставка или получение одного предмета в среднем - O (1).
Получение всех ключей для значения в среднем будет O (n):
[key for key in mydict if mydict[key] == value]
Однако, если добавление ключей или поиск всех ключей является обычной операцией, ваш dict
переворачивается. Вы хотите:
{'value': [key1, key2, ... keyn]}
Таким образом, вы можете добавить ключи с помощью mydict[value].append(newkey)
и получить все ключи с помощью mydict[value]
, и оба будут в среднем O (1).