Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 关于将无聊的事情自动化的问题:第5章_Python_Dictionary - Fatal编程技术网

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

Python 关于将无聊的事情自动化的问题:第5章,python,dictionary,Python,Dictionary,我是编程新手,目前正在使用Python(第二版)自动完成无聊的工作。在第5章中,有一个练习问题,涉及使用字典创建一个幻想游戏清单。我已经用其他人的答案完成了这个问题,但是,我不理解代码的特定部分 此代码表示将新的“dragonLoot”列表添加到当前库存,即字典“inv”。这是我的密码: def displayInventory(inventory): print("Inventory:") item_total = 0 for k, v in inventory.ite

我是编程新手,目前正在使用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”时,此代码如何允许将列表添加到字典中


非常感谢。

让我们在
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生成。非常感谢!