Ошибка при переборе словаря, key error
Столкнулся с проблемой: Есть словарь, содержащий в себе данные про операции в количестве 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"
}
Ответы (1 шт):
Автор решения: Алексей
→ Ссылка
Я бы рекомендовал использовать .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)