Как прочитать словарь в словаре?
Мне нужно узнать значение text
d = dict()
d = {'ans':{'anf':{'atributes':{'text':'res'}}}}
print(d.ans.anf.atributes['text'])
AttributeError: 'dict' object has no attribute 'ans'
Ответы (3 шт):
Автор решения: CrazyElf
→ Ссылка
print(d.ans.anf.atributes['text'])
Такое работает только в библиотеках, например Pandas, которые автоматически делают у объекта поля, к которым можно обращаться и так df['field'] и так df.field, с обычными словарями это не работает, к ним надо обращаться через индексирование (квадратные скобки):
print(d['ans']['anf']['atributes']['text'].lower())
Автор решения: Dmitry
→ Ссылка
Или через метод get()
print(d.get("ans").get("anf").get("atributes").get("text"))
Есть некоторое отличие от данной d["ans"]... конструкции. Например, не выкидывает исключение, если не найден ключ. Но выкинет исключение, если не существует ключ в середине директивы. Например,
# все ок
>>> d = {'ans':{'anf':{'atributes':{'text':'res'}}}}
>>> print(d.get("ans").get("anf").get("atributes").get("text"))
res
# не существует последнего ключа
>>> d = {'ans':{'anf':{'atributes':{'1':'res'}}}}
>>> print(d.get("ans").get("anf").get("atributes").get("text"))
None
# не существует anf-ключа
>>> d = {'ans':{'1':{'atributes':{'text':'res'}}}}
>>> print(d.get("ans").get("anf").get("atributes").get("text"))
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'NoneType' object has no attribute 'get'
Автор решения: Andy Pavlov
→ Ссылка
Если известно, что ключ есть, но не известно, где он, то можно поиском по словарю пройтись в таком виде:
def search_dict(data: dict, key: str):
res = None
for k, v in data.items():
if k == key:
res = v
if isinstance(v, dict):
res = search_dict(v, key)
return res
d = {'ans':{'anf':{'atributes':{'text':'res'}}}}
print(search_dict(d, 'text'))