这是一本来自python书的测试项目。我试图遍历列表并检查每个项目是否是字典中的键。如果是,则将1添加到字典值,如果没有添加密钥,然后将值设置为1.到目前为止我的代码是:
inv_original = {'gold coin' : 42, 'rope' : 1}
dragonloot = ['gold coin', 'dagger', 'gold coin', 'gold coin', 'ruby']
def addtoinventory(dict_a, addeditems):
for i in addeditems:
if dict_a.has_key(i):
dict_a[str(i)] = dict_a.get(i, 0) + 1
else:
dict_a[str(i)] = 1
return dict_a
inv = addtoinventory(inv_original, dragonloot)
print inv
它似乎有用,但仅适用于列表中的第一项,它不会迭代其余部分。有人可以帮忙吗?
答案 0 :(得分:2)
完成第一次迭代后,函数返回。
def addtoinventory(dict_a, addeditems):
for i in addeditems:
if dict_a.has_key(i):
dict_a[str(i)] = dict_a.get(i, 0) + 1
else:
dict_a[str(i)] = 1
return dict_a # <----- issue here
# ...
您应该将return
语句移到循环体外,方法是将该行除以4个空格以解决问题。你还应该考虑:
try
/ except
块代替if
/ else
,str(i)
电话;你的列表元素已经是字符串,因此不必尝试对它们进行字符串转换,inventory
而不是dict_a
,而items
代替addeditems
,这可能是多余的 - 如果它在列表中,它显然有已添加:)更新后的代码如下:
#!/usr/bin/python
inv_original = {'gold coin' : 42, 'rope' : 1}
dragonloot = ['gold coin', 'dagger', 'gold coin', 'gold coin', 'ruby']
def addtoinventory(inventory, items):
for i in items:
try:
inventory[i] += 1
except KeyError:
inventory[i] = 1
return inventory
#
print addtoinventory(inv_original, dragonloot)
# ...
代码的输出现在为:{'gold coin': 45, 'rope': 1, 'dagger': 1, 'ruby': 1}
,显示gold coin
键已增加3
,并且已添加其他键/值对,如您所料。