Многих SO сообщений показать вам, как эффективно проверять наличие ключа в словаре, например, Check if a given key already exists in a dictionaryпроверки питона многоуровневого ДИКТ ключ существование
Как это сделать для ключа мульти уровня? Например, если d["a"]["b"]
является ДИКТ, как я могу проверить, если d["a"]["b"]["c"]["d"]
существует не делать что-то чудовищное, как это:
if "a" in d and isInstance(d["a"], dict) and "b" in d["a"] and isInstance(d["a"]["b"], dict) and ...
Есть некоторые синтаксис как
if "a"/"b"/"c"/"d" in d
То, что я на самом деле использовать это для: мы имеем jsons, разбираемся в dicts, используя simplejson
, что мне нужно извлечь значения из. Некоторые из этих значений вложены в три и четыре уровня в глубину; но иногда значение вообще не существует. Так что я хотел что-то вроде:
val = None if not d["a"]["b"]["c"]["d"] else d["a"]["b"]["c"]["d"] #here d["a"]["b"] may not even exist
EDIT: предпочитают не вылетать, если некоторые подключ существует, но это не словарь, например, d["a"]["b"] = 5
.
Это не базовая функция языка, поскольку нет никакого способа, чтобы добавить новый синтаксис. Вы можете определить новый класс, который переопределяет функцию __contains__, которая вызывается выражением «x in y». Вы хотите эффективность синтаксиса или исполнения? Возможно, это не одно и то же. – mobiusklein
Ну, моя цель была эффективным синтаксисом, но это было в предположении, что время поиска словаря O (1) будет сохранено. Однако я понимаю, что сбор исключений стоит дорого, поэтому, возможно, это более активно, чем просто проверка существования ключа. – Tommy
Обработка исключений не будет дорогостоящей. То, что вы хотите принципиально, не на том языке, о котором указывал utdemir. Ответ Мейтэма близок к тому, что вы хотите, не делая гораздо больше работы, определяя класс, как я уже упоминал ранее, а затем испытываю трудности с тем, чтобы сделать 'simplejson' распаковывать объекты в эти слова, а не ванильные словари. – mobiusklein