【问题标题】:Calculating min difference between two dictionaries计算两个字典之间的最小差异
【发布时间】:2019-10-06 12:22:14
【问题描述】:

我正在尝试计算两个字典之间的差异以返回特定值。

我输入了不同的值,应该返回不同的结果,但结果保持不变。

diets = {"normal" : {'p': '32.50', 'c': '60', 'f': '40.86'},
         "oncology" : {'p': '35', 'c': '52.50', 'f': '37.63'},
         "cardiology" : {'p': '32.50', 'c': '30', 'f': '26.88'},
         "diabetes" : {'p': '20', 'c': '27.50', 'f': '27.95'},
         "kidney" : {'p': '15', 'c': '55', 'f': '23.65'}}

amounts = {'p': p, 'c': c, 'f': f}

value = { k : diets[k] for k in set(diets) - set(amounts) }

calculate_error = min(value)

print(calculate_error)

当我输入32、60、40时,返回的结果应该是正常的,但返回的是肿瘤学

【问题讨论】:

  • 您的 amounts 字典中的 pcf 值是什么?
  • p = 32,c = 60 和 f = 40。应该发生的情况是,无论输入什么数字,都应该返回最小的绝对差

标签: python dictionary min


【解决方案1】:

看起来你完全混淆了value 会是什么

>>> diets = {"normal" : {'p':'32.50', 'c':'60', 'f':'40.86'},
...          "oncology" : {'p':'35', 'c':'52.50', 'f':'37.63'},
...          "cardiology" : {'p':'32.50', 'c':'30', 'f':'26.88'},
...          "diabetes" : {'p':'20', 'c':'27.50', 'f':'27.95'},
...          "kidney" : {'p':'15', 'c':'55', 'f':'23.65'}}
>>> set(diets)
{'kidney', 'cardiology', 'oncology', 'normal', 'diabetes'}
>>> amounts = {'p':32, 'c':60, 'f':40}
>>> set(amounts)
{'c', 'f', 'p'}
>>> set(diets) - set(amounts)
{'cardiology', 'diabetes', 'kidney', 'oncology', 'normal'}
>>> value = { k : diets[k] for k in set(diets) - set(amounts) }
>>> value
{'cardiology': {'p': '32.50', 'c': '30', 'f': '26.88'},
 'diabetes': {'p': '20', 'c': '27.50', 'f': '27.95'},
 'kidney': {'p': '15', 'c': '55', 'f': '23.65'},
 'oncology': {'p': '35', 'c': '52.50', 'f': '37.63'},
 'normal': {'p': '32.50', 'c': '60', 'f': '40.86'}}
>>> min(value)
'cardiology'

那是说我希望你得到cardiology,即来自diets.keys() 的最小值 也就是说,请注意饮食中的值是 str,例如'32.50',您需要在进行任何计算之前转换这些值。

【讨论】:

    【解决方案2】:

    当你这样做时,你应该看看你正在创造的价值:

    set(diets)
    

    这只是一个键列表。

    {'cardiology', 'diabetes', 'kidney', 'normal', 'oncology'}
    

    当您减去其他键列表时,您只会得到原始列表,因为没有共同的值。

    您需要实际逐个检查项目并进行减法以获得差异。然后您可以找到差异的总和以及该总和的最小值。

    一种方法是:

    diets = {"normal" : {'p': '32.50', 'c': '60', 'f': '40.86'},
             "oncology" : {'p': '35', 'c': '52.50', 'f': '37.63'},
             "cardiology" : {'p': '32.50', 'c': '30', 'f': '26.88'},
             "diabetes" : {'p': '20', 'c': '27.50', 'f': '27.95'},
             "kidney" : {'p': '15', 'c': '55', 'f': '23.65'}}
    amounts = {'p': 32., 'c': 60., 'f': 40.}
    
    mins = [(diet, sum([abs(amounts[k] - float(d[k])) for k in amounts])) for diet, d in diets.items()]
    the_min = min(mins, key = lambda x: x[1])
    

    mins 将是:

    [('normal', 1.3599999999999994),
     ('oncology', 12.869999999999997),
     ('cardiology', 43.620000000000005),
     ('diabetes', 56.55),
     ('kidney', 38.35)]
    

    the_min 将是:

    ('normal', 1.3599999999999994)
    

    【讨论】:

    • 非常感谢。但我想打印不带数字的 the_min,只打印文本。
    • @JordanGamson the_min 只是一个元组。仅打印文本:print(the_min[0])。您需要分钟数,因为这是 min 用来找到最小值的,但您不需要使用或保留它们。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-13
    相关资源
    最近更新 更多