Преобразовать список словарей с вложенным списком словарей при возможном отсутствии ключа python

Рейтинг: -1Ответов: 1Опубликовано: 15.04.2023

Исходные данные на python:

lst = [
{'fruit': 'apple', 'types': [{'type':'green', 'amount':'2'},{'type':'red', 'amount':'3'}]},
{'fruit': 'melon', 'types': [{'type':'yellow', 'amount':'4'},{'type':'red', 'amount':'5'},{'type':'orange', 'amount':'1'}]}
]

нужно получить следующий словарь из списка lst:

dict = {'apple': {'green':'2','red':'3'},'melon': {'yellow':'4','red':'5','orange':'1'}}

в одном из предыдущих вопросов мне уже помогли со способом преобразования списка lst в нужный вид:

dict1 = {item['fruit']: {v['type']: v['amount'] for v in item['types']} for item in lst}

Однако некоторые вложенные словари в исходных данных lst могут не содержать в себе ключа 'amount', соответственно выдает ошибку: KeyError: 'amount'

Задача: дописать этот способ, чтобы он выдавал значение 'amount': None внутри вложенного словаря, если не нашел значение по ключу 'amount', чтобы не было такой ошибки KeyError: 'amount'

Буду очень благодарен помощи!

Ответы

▲ 1Принят

Надо чуть доработать dict comprehebsion - воспользоваться методом .get для словарей, который подставляет в искомый ключ значение по умолчанию, если этот ключ отсутствует в словаре:

lst = [
{'fruit': 'apple', 'types': [{'type':'green', 'amount':'2'},{'type':'red', 'amount':'3'}]},
{'fruit': 'melon', 'types': [{'type':'yellow', 'amount':'4'},{'type':'red', 'amount':'5'},{'type':'orange', 'amount':'1'}]},
{'fruit': 'banana', 'types': [{'type':'green'},{'type':'red', 'amount':'3'}]},
]

dict1 = {item['fruit']: {v['type']: v.get('amount', "unknown") for v in item['types']} for item in lst}
print(dict1)
{'apple': {'green': '2', 'red': '3'}, 'melon': {'yellow': '4', 'red': '5', 'orange': '1'}, 'banana': {'green': 'unknown', 'red': '3'}}