Доступ к стоимости внутри вложенных словарей

Я новичок в python и нуждаюсь в помощи в решении проблемы:

У меня есть словарь вроде

tmpDict = {'ONE':{'TWO':{'THREE':10}}}

Есть ли у нас какой-либо другой способ доступа к значению THREE, отличному от того, как делать

tmpDict['ONE']['TWO']['THREE']

?

Ответ 1

Вы можете использовать get() для каждого dict. Убедитесь, что вы добавили проверку None для каждого доступа.

Ответ 2

Как всегда в python, есть несколько способов сделать это, но есть один очевидный способ сделать это.

tmpdict["ONE"]["TWO"]["THREE"] - это очевидный способ сделать это.

Если это не соответствует вашему алгоритму, это может быть намеком на то, что ваша структура не подходит для проблемы.

Если вы просто хотите просто сохранить повторную типизацию, вы можете, конечно, псевдоним подмножества dict:

>>> two_dict = tmpdict['ONE']['TWO'] # now you can just write two_dict for tmpdict['ONE']['TWO']
>>> two_dict["spam"] = 23
>>> tmpdict
{'ONE': {'TWO': {'THREE': 10, 'spam': 23}}}

Ответ 3

Нет, это вложенные словари, так что это единственный реальный способ (вы можете использовать get(), но это то же самое по существу). Однако есть альтернатива. Вместо вложенных словарей вы можете вместо этого использовать кортеж:

tempDict = {("ONE", "TWO", "THREE"): 10}
tempDict["ONE", "TWO", "THREE"]

У этого есть недостаток, нет (простого и быстрого) способа получить все элементы "TWO", например, но если это не имеет значения, это может быть хорошим решением.

Ответ 4

Моя реализация:

def get_nested(data, *args):
    if args and data:
        element  = args[0]
        if element:
            value = data.get(element)
            return value if len(args) == 1 else get_nested(value, *args[1:])

Пример использования:

>>> dct={"foo":{"bar":{"one":1, "two":2}, "misc":[1,2,3]}, "foo2":123}
>>> get_nested(dct, "foo", "bar", "one")
1
>>> get_nested(dct, "foo", "bar", "two")
2
>>> get_nested(dct, "foo", "misc")
[1, 2, 3]
>>> get_nested(dct, "foo", "missing")
>>>

В случае отсутствия ключа исключений не возникает, в этом случае возвращается значение None.