Добавление значения None в попытке, кроме блока

#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() метод для доступа к элементам. по умолчанию он вернет None

2. Можете ли вы сделать списки читаемыми вместо принудительной прокрутки?

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)