Как обрабатывать KeyError только для некоторых записей словаря, а не для всех?

#python #database #dictionary #try-catch #keyerror

#python #База данных #словарь #попробуйте-поймайте #keyerror

Вопрос:

Я создаю таблицу с данными, полученными из запроса sparql. Проблема в том, что некоторые записи не имеют значения в базе данных, и когда я создаю таблицу, я получаю исключение keyerror. Как обработать исключение так, чтобы в полях, где срабатывает исключение, не было указано None? Пока значения None помещаются во всю строку, но исключение существует только в одной ячейке этой строки… Код Python приведен ниже:

  for j in range(len(results['results']['bindings'])):  # effective results from database
                try:
                    data.append([[results['results']['bindings'][j][results['head']['vars'][i]]['value']] for i in
                                 range(len(results['head']['vars']))])  
                except KeyError:
                    data.append([None])  # get each line sepparately

  

KeyError исключения возникает из-за того, что некоторые записи в базе данных имеют значение NULL, но код также ищет их. Как это решить?
Фактическая таблица приведена ниже:
введите описание изображения здесь

Здесь только срок службы батареи должен быть None, но результаты отсутствуют во всей строке.

Комментарии:

1. Просто использовать dict.get ?

Ответ №1:

Я бы рекомендовал не использовать понимание списка здесь. Код нечитаем

после того, как вы распакуете свой код, вы можете действовать по-разному:

  1. проверьте, существует ли ключ: if key in dict
  2. вернуть ключ по умолчанию: dict.get(test, None)

Комментарии:

1. но без понимания списка результаты будут разными (если я использую 2 разных «for»)

2. любое понимание списка совместимо с циклами for. просто создайте список, затем заполните этот список в цикле for. затем добавьте этот список к своим данным.

3. @Viktor, my_list = [] for i in range(len(results['head']['vars'])): my_list.append([results['results']['bindings'][j][results['head']['vars'][i]]['value']]) data.append(my_list)