我有以下三个字典:
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_add
。to_add
因此是带有键的列表,这些键A
是的复合键中不存在的数字Mynewdict
。假设所有的键B
也都在中A
。map
用于将字符串转换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] 删除。
我来说两句