Работа со списками, словари
Здравствуйте передо мной стоит такая задача:
Создать список (библиотека книг), состоящий из словарей (книги).
- Словари должны содержать как минимум 5 полей (например, номер, название, год издания...). В список добавить хотя бы 10 словарей.
Создать список (библиотека книг), состоящий из словарей (книги).
- Словари должны содержать как минимум 5 полей (например, номер, название, год издания...). В список добавить хотя бы 10 словарей. Конструкция вида:
library = [{"id" : 123456, "title" : "Война и мир","author" : "Толстой",...} , {...}, {...}, ...].Реализовать функции:
- вывода информации о всех книгах; – вывода информации о книге по введенному с клавиатуры номеру; – вывода количества книг, старше введённого года;
- обновлении всей информации о книге по введенному номеру; – удалении книги по номеру. Провести тестирование функций.
Вот так я попытался решить эту задачу :
library = [{"id": 12,\
"title" : "В интересах революции",\
"group" : "Агата Кристи"},\
{"id": 13,\
"title": "Серебро",\
"group":"Би-2"},\
{"id":14,\
"title": "Люди на холме",\
"group":"Наутилус Помпилиус"},\
{"id": 15,\
"title" : "Uselink",\
"group": "Depeche Mode"}]
def listAll(x,lib):
for i in range(len(library)):
el = '{},{},{}'\
.format( lib[i].get('id'),\
lib[i].get('title'),\
lib[i].get('group') )
return el
def outByNums(x,lib):
for i in range(len(library)):
el_sym = lib[i].get('id')
if int(x) is el_sym:
el2 = '{},{},{}'\
.format( library[i].get('id'),\
lib[i].get('title'),\
lib[i].get('group') )
return el2
def popByNums(x,lib):
for i in range(len(library)):
el_sym1 = lib[i].get('id')
if int(x) is el_sym1:
lib.pop(i)
return lib
x_in = int(input())
print(popByNums(x_in,library))
Мой вопрос такой: если в функции popByNum( ) поиск i-го элемента проходит нормально и я даже могу вернуть его индекс, то когда я пользую свойство .pop(i) то происходит ошибка:
File "task562.py", line 46, in popByNums
el_sym1 = lib[i].get('id') IndexError: list index out of range
я не понимаю, почему такое происходит, и как вообще можно удалить элемент по этому индексу, неужели придется переводить список в еще один словарь и работать с ним ?
Ответы (1 шт):
Вы удаляете книгу, список сокращается, а индекс и дальше идёт до старой длины списка.
Я бы изменил функцию следующим образом:
def popByNums(id, lib):
for i, book in enumerate(lib):
if id == book['id']:
lib.pop(i)
return lib
Т.е. сразу после нахождения нужной книги мы выходим из функции, и цикл не продолжает свою деятельность