Удалить словарь из списка на основе одного значения, введенного пользователем - python - PullRequest
0 голосов
/ 01 августа 2020

У меня есть начальный код:

books = []


def add_book():
    name = input('Input the name of the book: ')
    author = input('Input the author: ')
    print('Book added successfully.')

    books.append(
        {
            'name': name,
            'author': author,
            'read': False
        }
    )

Мне нужно, чтобы пользователь мог указать название книги, и если его вводные данные совпадают с именем в books, удалите весь словарь, который книга ее упоминается. Я придумал этот код:

def delete_book():
    user_input = input('Input the name of the book to be deleted: ')

    for book in books:
        for key, value in book.items():
            if book['name'] == user_input:
                books.remove(book)

Но он не работает ... Я просмотрел около 2 часов, чтобы найти решение, и, как новичок, я не могу понять этого, может быть, вы, ребята, сможете очистить в моем уме.

Теперь еще раз взглянем на значение ключа read из словаря. Я хочу, чтобы пользователь мог изменить значение на True. Я перепробовал много версий, но это еще сложнее. Вот что у меня есть:

def mark_read():  # TODO REVIEW !!!!
    book_name = input('Input name of the book: ')

    for book in books:
        if book == book_name:
            user_input = input('Mark book as read? (y/N): ')
            if user_input == 'N' or 'n':
                print('No changes were made')
            elif user_input == 'Y' or 'y':
                book.update(read=True)
        else:
            print('The specified book is not currently in our database.')

Итак, не могли бы вы сказать мне, где я ошибаюсь, дайте мне лучший, но читабельный вариант?

Ответы [ 2 ]

1 голос
/ 01 августа 2020

Код для удаления:

def delete_book():
    user_input = input('Input the name of the book to be deleted: ')

    for i,book in enumerate(books):
        if book['name'] == user_input:
            del books[i]

Код для пометки как прочитанного:

def mark_read():  # TODO REVIEW !!!!
    book_name = input('Input name of the book: ')
    f=0 #flag to see if book is present in dict
    for book in books:
        if book['name'] == book_name:
            f=1
            user_input = input('Mark book as read? (y/N): ')
            if user_input == 'N' or 'n':
                print('No changes were made')
            elif user_input == 'Y' or 'y':
                book['read']=True
            break #if book is found, you can exit the loop early
    if f==0:
        print('The specified book is not currently in our database.')
0 голосов
/ 01 августа 2020

Проблема с вашим кодом заключается в том, что вы зацикливаете словарь, когда вам нужно только одно поле (name). Таким образом, вы удаляли книгу с первым полем словаря, но вы пытались снова удалить запись со следующим полем словаря, что было невозможно.

Вам не нужно повторять все поля словаря для сравнения только одно поле. Работает следующее:

books =[{'name': "Hello", "author": "Arthur"}, {'name': "Hi", "author": "Vicky"}]

user_input = input('Input the name of the book to be deleted: ')

for book in books:
    if book['name'] == user_input:
        books.remove(book)
            
print(books)

Результат при вводе «Hi»:

[{'name': 'Hello', 'author': 'Arthur'}]
...