![](/img/trans.png)
[英]Why list comparision in python does value comparision instead of reference comparision?
[英]Python - dictionaries comparision
我在python中遇到字典比较问题。 我有2个字典,我想比较这些字典,当密钥相同时,该值将升级为valueFromFirstDictionary + valueFromSecondDictionary
。
函数'addToInventory()'应该有45个硬币而不是3个硬币,但问题出在哪里? 在循环中,它打印45,但是当我打印所有字典时,它显示3。
这是功能问题:
def addToInventory(inventory, addedItems):
dictionaryHelp = {}
for i in addedItems:
dictionaryHelp.setdefault(i,0)
dictionaryHelp[i] = dictionaryHelp[i] + 1
for i, k in inventory.copy().items():
for j, l in dictionaryHelp.items():
#print(i, k, j, l)
if i == j:
suma = k + l
inventory.update({i:suma})
#inventory[i] = suma
print(inventory[i])
break
else:
inventory[j] = l
print(inventory)
return(inventory)
inv = {'golden coin': 42, 'rope': 1}
dragonLoot = ['golden coin', 'dagger','golden coin', 'golden coin', 'ruby']
inv = addToInventory(inv, dragonLoot)
for k, v in inv.items():
print(str(k) + ': ' + str(v))
item_total = item_total + v
该代码也可以在Pastebin上使用 。
在你的for
循环中,仔细看看使用j
的else
stuite:
for i, k in inventory.copy().items():
for j, l in dictionaryHelp.items():
if i == j:
# ...
else:
inventory[j] = l
你循环遍历inventory()
的键,并为每个键遍历dictionaryHelp.items()
。 每当i == j
不成立时,你设置inventory[j] = l
。 在某些时候将'golden coin'
设置为45并不重要,您只需替换该结果即可。
但是,您不需要使用双循环 。 字典非常适合测试给定的密钥是否已经存在,只需key in dictionary
使用key in dictionary
; 如果您可以从该字典中获取该键的值,则为true。
这意味着您不需要遍历两个字典,只需使用其中一个键来查看另一个字段中是否有数字:
for item, count in dictionaryHelp.items():
if item in inventory:
inventory[item] = inventory[item] + count
else:
inventory[item] = count
inventory
,因为您现在没有对其进行循环。 您可以使用dict.get()
来代替测试item in inventory
中的item in inventory
而不是使用默认的0
值:
for item, count in dictionaryHelp.items(): inventory[item] = inventory.get(item, 0) + count
dict.get()
类似于使用dict.setdefault()
,但没有将字典中的键设置为默认值。
你真的不需要创建dictionaryHelp
。 只需将计数直接添加到您的inventory
字典中。 我在这里使用相同的dict.get()
技巧以0
开头,如果库存中还没有添加的项目:
def addToInventory(inventory, addedItems): for item in addedItems: inventory[item] = inventory.get(item, 0) + 1 return inventory
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.