Python 关于将无聊的事情自动化的问题:第5章
我是编程新手,目前正在使用Python(第二版)自动完成无聊的工作。在第5章中,有一个练习问题,涉及使用字典创建一个幻想游戏清单。我已经用其他人的答案完成了这个问题,但是,我不理解代码的特定部分 此代码表示将新的“dragonLoot”列表添加到当前库存,即字典“inv”。这是我的密码:Python 关于将无聊的事情自动化的问题:第5章,python,dictionary,Python,Dictionary,我是编程新手,目前正在使用Python(第二版)自动完成无聊的工作。在第5章中,有一个练习问题,涉及使用字典创建一个幻想游戏清单。我已经用其他人的答案完成了这个问题,但是,我不理解代码的特定部分 此代码表示将新的“dragonLoot”列表添加到当前库存,即字典“inv”。这是我的密码: def displayInventory(inventory): print("Inventory:") item_total = 0 for k, v in inventory.ite
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”时,此代码如何允许将列表添加到字典中
非常感谢。让我们在
addToInventory
函数中打破循环。首先我们有
inventory.setdefault(i,0)
此说明意味着“如果键i
不在清单
字典中,请将其设置为0
。在这种情况下(因为我们不使用的返回值)相当于
如果我不在inventory.keys()中:
存货[i]=0
接下来是这个指令
inventory[i]=inventory[i]+1
这基本上是一个,即为键i
的inventory
值添加1
另一种解释是,循环的是“对于addedItems
中的每个项目,将inventory
字典中的相应值设置为零(如果尚未存在),然后将其递增”
读完本书后,您可能会受益于花一些时间检查Python标准库的模块,尤其是它更适合您尝试实现的逻辑。让我们在addToInventory
函数中打破循环
inventory.setdefault(i,0)
此说明意味着“如果键i
不在清单
字典中,请将其设置为0
。在这种情况下(因为我们不使用的返回值)相当于
如果我不在inventory.keys()中:
存货[i]=0
接下来是这个指令
inventory[i]=inventory[i]+1
这基本上是一个,即为键i
的inventory
值添加1
另一种解释是,循环的是“对于addedItems
中的每个项目,将inventory
字典中的相应值设置为零(如果尚未存在),然后将其递增”
读完本书后,您可能会受益于花一些时间检查Python标准库的模块,尤其是,这将更适合您尝试实现的逻辑。如果尚未设置字典键,这可以防止出现键错误。
。您还可以从中使用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'
如果尚未设置字典键,这可以防止出现KeyError
。您还可以使用标准库中“集合”模块中的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'
感谢您的回复。好的,因为库存增加+1,我理解它可能会导致像“dagger”这样的值为1,因为它的当前值为0。但是,“金币”如何从原来的42变为45?如果字典中的所有内容都增加+1,“金币”不是吗值是43?因为这也应该增加1。因为在addedItems
列表中,出现了三次“金币”
。因此增加将出现三次:42+1+1+1=45
。嗯,好的。但是,还有一个“金币”42的值。那不是也加1吗?使总数为43+1+1+1=46吗?不,因为这正是我们要加的字典值。好吧,我理解,因为“我”值仅由addedItems生成。非常感谢!感谢您的响应。好的,因为库存正在递增+1,我理解它可能会导致“dagger”这样的值为1,因为它的当前值为0。但是,“金币”是如何生成的从原来的42变为45?如果字典中的所有内容都要增加+1,“金币”值不是应该增加43吗?因为这也应该增加1。因为在增补项列表中,有三次出现“金币”
。因此,增量将出现三次:42+1+1+1=45
。嗯,好吧。不过,也有一个“金币”值42。那不是加1吗?使总数为43+1+1+1=46吗?不,因为这正是我们要添加的字典值。好吧,我理解,因为“我”值仅由addedItems生成。非常感谢!