Mam początkowy kod:

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
        }
    )

Potrzebuję użytkownika, aby móc podać tytuł książki, a jeśli jego wejście ma nazwę w books, usuń cały słownik, który zarezerwował, o którym mowa. Wymyśliłem ten kod:

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)

Ale nie działa.

Teraz weź kolejny wygląd wartości klucza read ze słownika. Chcę, aby użytkownik mógł zmienić wartość na true. Próbowałem więc wielu wersji, ale to jest jeszcze trudniejsze. To jest to, co mam:

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.')

Czy mógłbyś powiedzieć mi, gdzie się mylę, daj mi lepszą, ale możliwość odczytywania noob?

0
Klein -_0 1 sierpień 2020, 14:46

2 odpowiedzi

Najlepsza odpowiedź

Kod do usuwania:

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]

Kod do znakowania jako odczytu:

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.')
1
Dharman 1 sierpień 2020, 12:09

Problem z kodem jest to, że zapętlasz słownika, gdy potrzebujesz tylko jednego pola (name). Dlatego usuwasz książkę pierwszą dziedziną słownika, ale próbowałeś ponownie usunąć wpis z następnym polem słownika, co nie było możliwe.

Nie musisz iterować wszystkie pola słownika, aby porównać tylko jedno pole. Następujące prace:

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)

Wynik podczas wprowadzania "Cześć":

[{'name': 'Hello', 'author': 'Arthur'}]
0
David Duran 1 sierpień 2020, 12:00