获取字典最小值的键,而该键在数组中

Posted

技术标签:

【中文标题】获取字典最小值的键,而该键在数组中【英文标题】:get the key of the minimum value of a dictionary which in turn the key is in an array 【发布时间】:2021-12-06 22:22:06 【问题描述】:

我想获取给定字典中具有最小值的键,但条件是该键在给定列表中

例如,这将是字典。

dict = 
    's': 0,
    'y': 5,
    't': 8,
    'z': 7,
    'x': 9

这是包含要检查的键的列表

list = ['y', 'z', 't', 'x'] 

我做了这个实现,但我认为它可以被优化或以更pythonic的方式制作。

a = float("inf")
for key in dict:
    if key in list:
        temp=a
        a = min(a,dict[key])
        if a < temp:
            minimum = key

【问题讨论】:

这里可能存在歧义。在您的字典中,将 't' 的值更改为 5。现在,所需的键是什么? “t”还是“y”? 【参考方案1】:

mindct.get 一起使用:

>>> min(lst, key=dct.get)
'y'
>>> 

根据dct 字典中该键的值,此获取是lst 中的最小值。

附:我将 dict 重命名为 dct 并将 list 重命名为 lst,因此您不会覆盖变量名。

编辑:

正如@Ch3steR 提到的,如果字典中有任何不在lst 中的键。

你可以使用:

min(lst, key=lambda x: dct.get(x, float('inf')))

或者您可以使用@Ch3steR 的方法:

min(dct.keys() & lst, key=dct.get)
'y'

但是我实现了我自己的type,命名为mydict,你可以使用它,它继承了dict,只是它还有一个__missing__魔术方法定义,所以它会给float('inf')(无穷大)如果密钥不存在。假设lst 变为:

lst = ['y', 'z', 't', 'x', 'key that does not exist']

那你继承mydict类型:

mydict = type('mydict', (dict,), '__missing__': lambda self, key: float('inf'),)

现在你可以直接使用__getitem__了:

>>> min(lst, key=mydict(dct).__getitem__)
'y'
>>> 

相同的mydict 类型可以被继承:

class mydict(dict):
    def __missing__(self, key):
        return float('inf')

它也会起作用。

【讨论】:

但是如果存在额外的密钥,这种方法会引发错误,例如 lst is lst = ['y', 'z', 't', 'x', 'aa'] PS:不是反对者。 @Ch3steR 刚决定做一些有趣的事情:) 看看 您已经涵盖了我删除答案的所有内容。我在想我们可以使用functools.partial吗? @Ch3steR 好的!会尝试【参考方案2】:

这是使用列表理解的一种方法:

dict = 
    's': 0,
    'y': 5,
    't': 8,
    'z': 7,
    'x': 9

list = ['y', 'z', 't', 'x'] 
temp =min([j for i,j in dict.items() if i in list])     ##output - 5
res = [i for i,j in dict.items() if dict[i]==temp]      
print(*res)

输出:

y 

【讨论】:

以上是关于获取字典最小值的键,而该键在数组中的主要内容,如果未能解决你的问题,请参考以下文章

在包含“无”/“假”值的字典上获取具有最小值的键

返回与字典中第三个值最小的元组对应的键

返回最小值的键[重复]

如何在 PHP 中的键 => 值对数组中获取最小值、最大值和平均值?

向 lambda 函数添​​加附加逻辑以从 python 字典中获取最小值

JavaScript:检查对象数组中是不是存在重复的键值并删除所有但最近添加的具有该键值的对象