我在这里有一个词典:
dic = {'A':1, 'B':6, 'C':42, 'D':1, 'E':12}
和列表:
lis = ['C', 'D', 'C', 'C', 'F']
我正在尝试做的是(也是作业的要求)检查lis中的值是否与dic中的键匹配,如果是,则增加1(例如,lis中的3'C')那么在'C'的输出中应该是45)。如果没有,那么我们在dic中创建一个新项目并将值设置为1.
因此示例输出应如下所示:
dic = {'A':1, 'B':6, 'C':45, 'D':2, 'E':12, 'F':1}
以下是我的代码:
def addToInventory(dic, lis):
for k,v in dic.items():
for i in lis:
if i == k:
dic[k] += 1
else:
dic[i] = 1
return dic
并通过此代码执行:
dic = addToInventory(dic,lis)
它编译没有错误,但输出很奇怪,它将缺少的F添加到dic中,但没有正确更新值。
dic = {'A':1, 'B':6, 'C':1, 'D':1, 'E':12, 'F':1}
我在这里缺少什么?
答案 0 :(得分:3)
当它支持随机查找时,无需迭代字典。您可以使用if x in dict
执行此操作。此外,您需要在循环外使用return
语句。
请尝试:
def addToInventory(dic, lis):
for i in lis:
if i in dic:
dic[i] += 1
else:
dic[i] = 1
return dic
out = addToInventory(dic, lis)
print(out)
{'A': 1, 'B': 6, 'C': 45, 'D': 2, 'E': 12, 'F': 1}
作为Harvey suggested,您可以通过使用dict.get
来缩短功能。
def addToInventory(dic, lis):
for i in lis:
dic[i] = dic.get(i, 0) + 1
return dic
dic.get
函数有两个参数 - 密钥,如果与该密钥关联的值尚不存在,则传递默认值。
如果您的教授允许使用库,您可以使用collections.Counter
数据结构,这正是为了保持计数。
from collections import Counter
c = Counter(dic)
for i in lis:
c[i] += 1
print(dict(c))
{'A': 1, 'B': 6, 'C': 45, 'D': 2, 'E': 12, 'F': 1}