添加键中缺少值的字典值

塔纳·科卡萨

我有以下三个字典:

Mydict = {'(1)': 850.86,
          '(1, 2)': 1663.5,
          '(1, 2, 3)': 2381.67,
          '(1, 3)': 1568.89,
          '(2)': 812.04,
          '(2, 3)': 1529.45,
          '(3)': 717.28}

A = {1: 4480.0, 2: 3696.0, 3: 4192.5}
B = {1: 1904.62, 2: 1709.27, 3: 1410.73}

根据中的键Mydict,我想添加缺少的键值min(A, B)例如,对于第一个键'(1)'Mydict,我要添加min(A[2], B[2]) + min(A[3], B[3])到第一行的值,并更新在字典中的价值。类似地,对于key:的值'(1, 2)',我想添加min(A[3] + B[3])as,因为其中仅3缺少。对于'(1, 2, 3)',我不需要添加任何内容,因为它涉及所有3个数字,即1、2和3。因此,我的新内容Mydict将如下所示:

Mynewdict = {'(1)': 3970.86,
              '(1, 2)': 3074.23,
              '(1, 2, 3)': 2381.67,
              '(1, 3)': 3278.16,
              '(2)': 4127.39,
              '(2, 3)': 3434.07,
              '(3)': 4331.17}

在此示例中,的所有值B均小于的值A,但是,可能并非一直如此,这就是为什么我要添加其中的最小值。感谢您的回答。

阿特鲁

数字列表听起来是个好主意,但对我来说,它仍然需要与以下解决方案相似的(相似)运算量:

import re

str_pat = re.compile(r'\((.*)\)')

Mynewdict = Mydict
for key in Mynewdict.keys():

    match = (str_pat.findall(key)[0]).split(',')

    # set(list(map(int, match))) in Python 3.X
    to_add = list(set(A.keys()).difference(set(map(int,match))))

    if to_add:
        for kAB in to_add:
            Mynewdict[key] += min(A[kAB],B[kAB])

对于Mynewdict该程序中的每个键,都找到括号之间的模式并将其转换为一个列表,并用match分隔,然后将此列表与A中的键列表进行比较。

比较过程通过集合-程序构造了两个列表中的集合,并将集合差(也变成了列表)返回到中to_addto_add因此是带有键的列表,这些键A是的复合键中不存在的数字Mynewdict假设所有的键B也都在中Amap用于将字符串转换match为整数(与A中的整数键进行比较)。要在Python 3.X中使用它,您还需要将其map(int, match)变成注释中所述的列表。

程序的最后部分将A和B之间的最小值分配给每个遗失的键,并将其分配给的现有值Mynewdict由于Mynewdict最初是Mydict所有最终键和初始值的副本,因此该程序无需检查键是否存在或显式添加初始值。

要查找Mynewdict对应于特定值的键,看来您实际上必须遍历字典:

find_val = round(min(Mynewdict.values()),2)
for key,value in Mynewdict.items():
    if find_val == round(value,2):
        print key, value

这里重要的是四舍五入。这是必要的,因为中的值Mynewdict具有可变的精度,通常比您要查找的值的精度长。换句话说,round(value,2)如果不存在,则if会评估False为实际存在的情况True

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章