【问题标题】:Update a dictionary with values from a list in Python使用 Python 列表中的值更新字典
【发布时间】:2018-02-11 16:32:19
【问题描述】:

我这里有一本字典:

dic = {'A':1, 'B':6, 'C':42, 'D':1, 'E':12}

这里有一个列表:

lis = ['C', 'D', 'C', 'C', 'F']

我要做的是(也是家庭作业的要求)检查 lis 中的值是否与 dic 中的键匹配,如果匹配,则递增 1(例如 lis 中有 3 个“C”那么在 dic '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}

我在这里错过了什么?

【问题讨论】:

    标签: python list loops dictionary


    【解决方案1】:

    当字典支持随机查找时,无需遍历字典。您可以使用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}
    

    【讨论】:

    • if i in dic:if dic.get(i): 好吗?
    • @ScottBoston 按分数。因为dic.get(i) 会导致函数调用,然后是对返回值的评估。 if i in dic应该更快。
    • 一行:dic[i] = dic.get(i, 0) + 1
    • @cᴏʟᴅsᴘᴇᴇᴅ 我的错,return 语句在循环之外,错字
    • 如果您的任何密钥是假的,if dic.get(i): 也会搞砸您。例如,如果 dic[i] 为 0,则此测试的行为与 i 不在 dic 中一样。如果你想使用一个花哨的 dict 方法,你可以做类似dic[i] = dic.get(i, 0) + 1
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-02
    • 2018-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-21
    相关资源
    最近更新 更多