@Darkzenon

Как записать путь ключей в словере python?

Добрый день.
Столкнулся с проблемой. Сайт отдает по API Json, но количество полей может отличаться.
Есть список полей которые мне нужны, если их нет, тогда "None"
Json я преобразую в словарь и таким образом получаю данные.
Проблема, если определенных ключей нет, то python возвращает ошибку.
x=JsonData['folder']['attrs']['music']['a']
Хотел использовать метод get но не понимаю как записать путь в словаре.
path = ('folder','attrs','music','a') ?????????????
value= JsonData.get (path,"None")

Можно конечно делать проверку для каждого пути руками.
if key in JsonData:
      value =JsonData['folder']['attrs']['music']['a']


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

типа этого
path = [('folder','attrs','music','a'),('folder','attrs','music','b'),('folder','attrs','docs','w','a'),('folder','attrs','zip','a').....]
for i in path:
      value= JsonData.get (i,"None")


нагуглил решение.
если есть ключ, возвращает значение, если нет возвращает None.
даже без прверок на исключение.

import operator
from functools import reduce

path = ('folder','attrs','music','a')
value = reduce(operator.getitem, path , JsonData)
  • Вопрос задан
  • 468 просмотров
Решения вопроса 1
@Darkzenon Автор вопроса
Нагуглил ))

import operator
from functools import reduce

path = ('folder','attrs','music','a')
value = reduce(operator.getitem, path , JsonData)
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
@gill-sama
get использовать как то так:

value = JsonData.get('folder').get('attrs').get('music').get('a') #это не избавит от ошибки, ибо get от None не работает

но проще если вы знаете цепочки атрибутов, засунуть обработку в try-except блоки
try:
  value = JsonData['folder']['attrs']['music']['a']
except:
  pass #do nothing
Ответ написан
qlkvg
@qlkvg
python backend developer
def get_nested_value(path, my_dict):
    tmp = my_dict.get(path[0])
    if tmp:
        if type(tmp) == dict:
            if len(path) is not 1:
                return get_nested_value(path[1:], tmp)
        elif type(tmp) == str and len(path) == 1:
            return tmp
    return None

tst_dict = {"a": {"b": {"c": "value"}}}
path = ["a", "b", "c",]
print get_nested_value(path, tst_dict)


Кривенько получилось, можно симпатичнее рекурсивный перебор накидать.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы