关于将无聊的事情自动化的问题:第5章

2024-06-16 10:26:47 发布

您现在位置:Python中文网/ 问答频道 /正文

我是编程新手,目前正在使用Python(第二版)自动完成无聊的工作。在第5章中,有一个练习问题,涉及使用字典创建一个幻想游戏清单。我已经用其他人的答案完成了这个问题,但是,我不理解代码的特定部分

此代码表示将新的“dragonLoot”列表添加到当前库存,即字典“inv”。这是我的密码:

def displayInventory(inventory):
    print("Inventory:")
    item_total = 0
    for k, v in inventory.items():
         item_total = item_total + v
         print(str(v) + " " + k)
    print("Total number of items: " + str(item_total))

def addToInventory(inventory, addedItems):
    for i in addedItems:
        inventory.setdefault(i, 0)
        inventory[i] = inventory[i] + 1
    return inventory



inv = {'gold coin': 42, 'rope': 1}
dragonLoot = ['gold coin', 'dagger', 'gold coin', 'gold coin', 'ruby']
inv = addToInventory(inv, dragonLoot)

displayInventory(inv)

我的问题与这一具体部分有关:

def addToInventory(inventory, addedItems):
for i in addedItems:
    inventory.setdefault(i, 0)
    inventory[i] = inventory[i] + 1
return inventory

当输入“inventory.setdefault(i,0)”,然后输入“inventory[i]=inventory[i]+1”时,此代码如何允许将列表添加到字典中

多谢各位


Tags: 代码infor字典defitemtotalinventory
2条回答

让我们将addToInventory函数中的循环分解。首先我们有

inventory.setdefault(i ,0)

此指令表示“如果i键不在inventory字典中,请将其设置为0。在本例中(因为我们不使用^{}的返回值),它相当于

if i not in inventory.keys():
    inventory[i] = 0

接下来是这个指令

inventory[i] = inventory[i] + 1

它基本上是一个incrementation,也就是说,i键的inventory值加1

另一种解释是,for循环是“对于addedItems中的每一项,将inventory字典中的对应值设置为零(如果尚未存在),然后将其递增”


读完本书后,您可能会从花一些时间检查Python标准库的^{}模块中获益,尤其是^{}^{}模块,它们更适合您尝试实现的逻辑

如果尚未设置字典密钥,则这是针对KeyError的保护。您还可以使用标准库中collections模块中的defaultdict

考虑以下

inventory = {}
addedItems = ['1', '2', '3']
addToInventory(inventory, addedItems)

即使库存为空,您也可以获得正确的输出。这是因为setdefault确保在密钥不存在时使用默认值创建密钥。它使您不必使用if/then语句来判断该键是否已在dict中

{'1': 1, '2': 1, '3': 1}

现在,在不使用setdefault行的情况下尝试相同的函数

def addToInventory(inventory, addedItems):
    for i in addedItems:
        inventory[i] = inventory[i] + 1
    return inventory

inventory = {}
addedItems = ['1', '2', '3']
addToInventory(inventory, addedItems)

=== Output: ===
                                     -
KeyError                                  Traceback (most recent call last)
<ipython-input-137-8302116925c5> in <module>
      6 inventory = {}
      7 addedItems = ['1', '2', '3']
  > 8 addToInventory(inventory, addedItems)

<ipython-input-137-8302116925c5> in addToInventory(inventory, addedItems)
      1 def addToInventory(inventory, addedItems):
      2     for i in addedItems:
  > 3         inventory[i] = inventory[i] + 1
      4     return inventory
      5 

KeyError: '1'

现在看看如果使用defaultdict会发生什么

from collections import defaultdict
def addToInventory(inventory, addedItems):
    for i in addedItems:
        inventory[i] = inventory[i] + 1
    return inventory

inventory = defaultdict(int)
addedItems = ['1', '2', '3']
addToInventory(inventory, addedItems)

=== Output: ===
Out[143]: defaultdict(int, {'1': 1, '2': 1, '3': 1})

相关问题 更多 >