我正在处理一个练习问题,用户将库存保存为字典,例如:
inventory = {
'rope': 1,
'gold coin': 42,
}
然后,我需要通过稍后在库存中添加“抢劫”来修改它。
例如:
loot = ['gold coin', 'dagger', 'gold coin', 'gold coin', 'ruby']
我最终在Counter
内collections
使用def add_to_inventory(original_inventory, added_items):
new_inventory = Counter(original_inventory) + Counter(added_items)
return(new_inventory)
inventory = add_to_inventory(inventory, loot)
就可以轻松完成此操作:
45: gold coin
1: rope
1: ruby
1: dagger
结果是:
#1 file.coffee
#2 file.js.coffee
哪一切都很好,但我想知道.. 有没有合理的方法来解决这个问题而不必导入库?
答案 0 :(得分:5)
您只需使用dict
的{{1}}方法:
get
输出:
inventory = {'rope': 1, 'gold coin': 42,}
loot = ['gold coin', 'dagger', 'gold coin', 'gold coin', 'ruby']
for k in loot:
inventory[k] = inventory.get(k, 0) + 1
print inventory
答案 1 :(得分:3)
您可以简单地遍历清单和增量密钥(如果存在),或者使用EAFP方法将值启动为1:
for l in loot:
try:
inventory[l] += 1
except KeyError:
inventory[l] = 1
在您谈论替代方案时,collections
模块中还有defaultdict
对象非常有用:
from collections import defaultdict
inventory = defaultdict(int)
for l in loot:
inventory[l] += 1
答案 2 :(得分:3)
Delgan给出的答案相同,但我们可以使用setdefault来初始化
def add_to_inventory(inventory, loot):
for l in loot:
inventory[l] = inventory.setdefault(l, 0) + 1