如何在Python中更新字典中某个键的值?

39

我有一个字典,它代表一家书店。键表示书名,值表示书的库存数量。当书店销售图书时,书的库存数量必须减少。

我已经编写了代码来减少已售书的库存数量,但在更新后打印字典时,我得到的是初始字典而不是更新后的字典。

 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

 choice = raw_input("Do you want to sell?")
 if (choice in 'yesYES'):
        for i in range(n):
             print("Which book do you want to sell: ", book_shop)
             ch1 = raw_input("Enter your choice: ")
             if(book_shop.keys()[i] == ch1):
                    book_shop.keys()[i] = (book_shop.values()[i]-1)
                    break
        
 print(book_shop)

我希望能以最简单的方式解决问题。我的代码是否存在任何逻辑或者漏掉了某些行?

5个回答

66

我认为直接通过引用键从该值中减去是更简单的方法。

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

根据您的情况:

book_shop[ch1] -= 1

我将这一行代码进行了修改:book_shop.keys()[i]=(book_shop.values()[i]-1),改为了book_shop.keys()[i]-=1,但是似乎还是不起作用。 - Animeartist
修改为 book_shop[ch1] -= 1 - Christian W.
谢谢,它起作用了。你能告诉我我的代码哪里出错了吗? - Animeartist
通过 dict_keys()[index] 引用您的字典有点奇怪,可能与此有关。顺便说一下,在 Python3 中,这种类型的访问不再可能,因此最好直接通过键进行索引并直接修改值,就像我的答案中所示。 - Christian W.
我正在使用Python 2.7,而使用dict.keys()[index]的引用字典在其中也无法正常工作。因此,这一行代码:book_shop.keys()[i]=(book_shop.values()[i]-1)是无效的吗? - Animeartist
那么,这就是你的问题了。在某个黑暗历史时期,keys()曾经返回一个可以通过索引访问的列表。我甚至没有安装Python 2.7,但至少在Python 3中,该行会失败。即使它不是无效的,它看起来也不太整洁,不是吗? - Christian W.

12
d = {'A': 1, 'B': 5, 'C': 2}
d.update({'A': 2})

打印(d)

{'A': 2, 'B': 5, 'C': 2}

5
你可以直接指定一个新值到已存在的键中:
t = {}
t['A'] = 1
t['B'] = 5
t['C'] = 2

print(t)

{'A': 1, 'B': 5, 'C': 2}

现在让我们更新其中一个键:

t['B'] = 3

print(t)

{'A': 1, 'B': 3, 'C': 2}

1
您正在修改列表book_shop.values()[i],但其在字典中未被更新。每当您调用values()方法时,它将为您提供字典中可用的值,在这里您并未修改字典的数据。

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

3
请您能否加上一些文字来帮助解释您的答案? - Joey

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接