使用Python中的列表中的值更新字典

时间:2017-09-03 03:43:36

标签: python list loops dictionary

我在这里有一个词典:

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}

我在这里缺少什么?

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}