#python
#python
Вопрос:
Мне интересно, возможно ли добавить a None
в словарь, если атрибут отсутствует. Здесь я создал несколько похожую проблему, с которой я сталкиваюсь, используя словарь. В этом примере в словаре отсутствует некоторая пара ключей и значений (в данном случае в стране Эквадор отсутствует информация о регионе, а в стране Испания отсутствует информация о континенте).
Я хочу создать новый словарь с включенными отсутствующими ключами и значениями (значение будет None
). Другими словами, новый словарь будет содержать поле area с None для страны Эквадор и поле continent с None для Испании.
country_info =[{'Country' : 'Sri Lanka', 'Continent' : 'Asia', 'Area' : 65610}, {'Country': 'Ecuador', 'Continent':'South America'}, {'Country' : 'Botswana', 'Continent' : 'Africa', 'Area' : 581730}, {'Country' : 'Vietnam', 'Continent' : 'Asia', 'Area' : 331212}, {'Country' : 'Spain', 'Area' : 505990 }]
country_info
new_list = []
for i in country_info:
try:
new_list.append({
'country' : i['Country'],
'continent' : i['Continent'],
'area' : i['Area']
})
except KeyError:
None
Приведенный выше код воссоздает тот же исходный словарь. Чего я желаю, так это…
вывод:
country_info =[{'Country' : 'Sri Lanka', 'Continent' : 'Asia', 'Area' : 65610}, {'Country': 'Ecuador', 'Continent':'South America', 'Area' : None}, {'Country' : 'Botswana', 'Continent' : 'Africa', 'Area' : 581730}, {'Country' : 'Vietnam', 'Continent' : 'Asia', 'Area' : 331212}, {'Country' : 'Spain', 'Continent' : None, 'Area' : 505990 }]
Комментарии:
1. используйте
dict.get()
метод для доступа к элементам. по умолчанию он вернет None2. Можете ли вы сделать списки читаемыми вместо принудительной прокрутки?
3. Если вы хотите использовать регистр заголовка, почему вы используете нижний регистр?
Ответ №1:
Если вы просто хотите, чтобы выполнялись неудачные поисковые None
запросы, используйте dict.get
метод вместо поиска в квадратных скобках и KeyError
полностью избегайте:
new_list = []
for i in country_info:
new_list.append({
'country' : i.get('Country'),
'continent' : i.get('Continent'),
'area' : i.get('Area')
})
Проблема с перехватом KeyError
заключается в том, что вы пропускаете весь append
связанный код, когда это происходит, и это раздражает (хотя и не невозможно), чтобы правильно определить, какой ключ отсутствовал. Поскольку get
фактически это выражение по выражению «catch KeyError
, replace with default
(которое само по умолчанию None
равно)», здесь это намного удобнее.
Комментарии:
1. Исправление моего ответа приведет к этому ответу. поэтому удалил мой. Спасибо всем за исправление.
Ответ №2:
Вы можете указать значение по умолчанию для ключа, если оно не существует. Просто сделайте
...
'area':i.get('Area',None)
...
Ответ №3:
Еще два способа:
new_list = [
{'Country': None, 'Continent': None, 'Area': None, **i}
for i in country_info
]
new_list = []
for i in country_info:
info = dict.fromkeys(('Country', 'Continent', 'Area'))
info.update(i)
new_list.append(info)