Ошибка при переборе словаря, key error

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

Столкнулся с проблемой: Есть словарь, содержащий в себе данные про операции в количестве 100 штук Написал программу которая перебирает словарь, и выдает нужную операцию по ID либо по ее порядковому номеру.

Суть проблемы: Выдает только ДО 74 операции включительно, дальше выдает

  if int(user_input) == i['id']:
KeyError: 'id'

Структура словаря при этом не меняется.

if user_input.isnumeric():
    if int(user_input) not in range(1, self.counts) and int(user_input) not in self.ids:
        print(error.wrong_id())
        return error.wrong_id()
    else:
        if len(user_input) > 3: # Это вывод по ID
            for i in self.operations_dict:
                if int(user_input) == i['id']:
                    return self.information(i)

        if len(user_input) < 4: # Это вывод по порядковому номеру
            for i in self.operations_dict:
                if self.ids[int(user_input)-1] == i['id']:
                    return self.information(i)

Нерабочий пример из словаря:

{
  "id": 667307132,
  "state": "EXECUTED",
  "date": "2019-07-13T18:51:29.313309",
  "operationAmount": {
    "amount": "97853.86",
    "currency": {
      "name": "руб.",
      "code": "RUB"
    }
  },
  "description": "Перевод с карты на счет",
  "from": "Maestro 1308795367077170",
  "to": "Счет 96527012349577388612"
}

Рабочий пример из словаря:

{
  "id": 441945886,
  "state": "EXECUTED",
  "date": "2019-08-26T10:50:58.294041",
  "operationAmount": {
    "amount": "31957.58",
    "currency": {
      "name": "руб.",
      "code": "RUB"
    }
  },
  "description": "Перевод организации",
  "from": "Maestro 1596837868705199",
  "to": "Счет 64686473678894779589"
}

Ответы

▲ 0Принят

Я бы рекомендовал использовать .get(serchkey, default_value_for_None_key), где:

  • serchkey - искомый ключ
  • default_value_for_None_key - дефолтное значение для отсутствующего ключа

Например так:

d = {'k1': 'val1',
     'k2': 'val2'}

for search_key_dict in ['k2','k3']:
    if (key_dict:= d.get(search_key_dict, None)):
        print(f'бла бла.. есть ключ {search_key_dict} его значение: {key_dict}')
    else:
        print(f'эх, ключа  {search_key_dict} нет...')
        continue

Выдаст такое:

бла бла.. есть ключ k2 его значение: val2
эх, ключа  k3 нет...

Соответственно, у Вас вышло бы что-то такое:

if len(user_input) > 3:
    for i in self.operations_dict:
        if (id_key := i.get('id')) and id_key == int(user_input):
            return self.information(i)