我正在尝试编写一个更新字典中值的程序。
stuff = {'rope': 1, 'torch': 6, 'gold coin': 42, 'dagger': 1, 'arrow': 12}
dragonLoot = ['gold coin', 'dagger', 'gold coin', 'gold coin', 'ruby']
#stuff = addToInventory(stuff, dragonLoot)
for i in range(len(dragonLoot)):
for k, v in stuff.items():
if dragonLoot[i] == k:
v += 1
displayInventory(stuff)
正如您所看到的,我已经在我的主要部分中移动了片段,以确保它不是该功能的问题。外部for循环也有效。问题是,v
只是更新了。 displayInventory()
打印与顶部声明中相同的值。
提前感谢您的意见!
答案 0 :(得分:1)
v
确实已更新,问题是您没有将其分配回stuff[k]
,因此新值会丢失。
用
修复它for i in range(len(dragonLoot)):
for k, v in stuff.items():
if dragonLoot[i] == k:
stuff[k] = v + 1
答案 1 :(得分:1)
v
确实已更新,但stuff[k]
没有更新 - 它们是相同的值(最初),但不是相同的变量。您需要将新值分配给stuff[k]
,而不是v
。
答案 2 :(得分:1)
您可以使用以下方法:
stuff = {'rope': 1, 'torch': 6, 'gold coin': 42, 'dagger': 1, 'arrow': 12}
dragonLoot = ['gold coin', 'dagger', 'gold coin', 'gold coin', 'ruby']
for item in dragonLoot:
stuff[item] = stuff.get(item, 0) + 1
print stuff
给你:
{'gold coin': 45, 'dagger': 2, 'torch': 6, 'rope': 1, 'arrow': 12, 'ruby': 1}
stuff.get(item, 0)
从字典中返回item
,但如果它不存在(例如ruby
),则返回默认值0
。我只需在值中添加一个并将其分配回字典。
答案 3 :(得分:1)
Python中的+=
运算符很棘手。对于某些类型,它将修改左侧引用的对象。然而,在其他情况下,这是不可能的(因为类型是不可变的)。在这些情况下,它会将左侧重新绑定到新对象。这不会改变对其他地方可能存在的旧值的其他引用。
您可以在更简单的场景中了解这一点:
x = 1
y = x # reference to the same int object
y += 1 # can't modify 1 in place, so only rebinds
print(x) # prints 1 still
在您的代码中,x
为stuff[k]
(通过循环隐式访问),y
为v
。您需要编写stuff[k] = v+1
以使代码按照您的意愿执行。
答案 4 :(得分:0)
stuff.items()
返回由k
和v
组成的元组。
k
和v
都是新的和不同的名称。
元组和整数是不可变的,所以当你执行v += 1
时,python会创建一个值为updated的新对象。
原始的stuff
词典保持不变。
使用
stuff[k] = v+1
代替
答案 5 :(得分:0)
整数是基元,而不是引用。因此,当i=0
和k='gold coin'
,v
指向为1时,v
是 1.然后你加1,它变成2,但stuff
根本没有变化。
您需要通过编写
明确更改stuff
stuff[k] += 1
而不是向v
添加一个。
答案 6 :(得分:0)
如果您想计算冒险者携带的物品,最好使用Counter
。它们从0开始自动启动,让您简化逻辑:
from collections import Counter
stuff = Counter({'rope': 1, 'torch': 6, 'gold coin': 42, 'dagger': 1, 'arrow': 12})
dragonLoot = ['gold coin', 'dagger', 'gold coin', 'gold coin', 'ruby']
for loot in dragonLoot:
stuff[loot] += 1