Как обновить значение ключа в словаре в Python?

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

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

 n=input("Enter number of books in shop:")
 book_shop={} #Creating a dictionary book_shop
 #Entering elements into the dictionary
 for i in range(n):
     book_title=raw_input("Enter book title")
     book_no=input("Enter no of copies")
     book_shop[book_title]=book_no
 ch=raw_input("Do you want to sell")
 if (ch in 'yesYES'):
        for i in range(n):
             print"which book you want to sell??",book_shop
             ch1=raw_input("choice")
             if(book_shop.keys()[i]==ch1):
                    book_shop.keys()[i]=(book_shop.values()[i]-1)
                    break

 print book_shop

Я хотел бы решить проблему самым простым способом. Я пропустил какую-либо логику или любую строку в коде?

Ответы

Ответ 1

Ну, вы можете напрямую вычесть из значения, просто ссылаясь на ключ. Что, на мой взгляд, проще.

>>> books = {}
>>> books['book'] = 3       
>>> books['book'] -= 1   
>>> books   
{'book': 2}   

В твоем случае:

book_shop[ch1] -= 1

Ответ 2

Вы book_shop.values()[i] список book_shop.values()[i], который не обновляется в словаре. Всякий раз, когда вы вызываете метод values(), он дает вам значения, доступные в словаре, и здесь вы не изменяете данные словаря.

Ответ 3

n = eval(input('Num books: '))
books = {}
for i in range(n):
    titlez = input("Enter Title: ")
    copy = eval(input("Num of copies: "))
    books[titlez] = copy

prob = input('Sell a book; enter YES or NO: ')
if prob == 'YES' or 'yes':
    choice = input('Enter book title: ')
    if choice in books:
        init_num = books[choice]
        init_num -= 1
        books[choice] = init_num
        print(books)