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

Fac*_*ral 4 python dictionary min python-3.x

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

例如,这将是字典。

dict = {
    's': 0,
    'y': 5,
    't': 8,
    'z': 7,
    'x': 9
}
Run Code Online (Sandbox Code Playgroud)

这是要检查的键的列表

list = ['y', 'z', 't', 'x'] 
Run Code Online (Sandbox Code Playgroud)

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

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

U10*_*ard 7

min与以下一起使用dct.get

>>> min(lst, key=dct.get)
'y'
>>> 
Run Code Online (Sandbox Code Playgroud)

lst这是基于字典中该键的值的最小值dct

PS 我将其重命名dictdctlistto lst,这样您就不会覆盖变量名称。

编辑:

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

你可以使用:

min(lst, key=lambda x: dct.get(x, float('inf')))
Run Code Online (Sandbox Code Playgroud)

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

min(dct.keys() & lst, key=dct.get)
'y'
Run Code Online (Sandbox Code Playgroud)

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

lst = ['y', 'z', 't', 'x', 'key that does not exist']
Run Code Online (Sandbox Code Playgroud)

然后你继承mydict类型:

mydict = type('mydict', (dict,), {'__missing__': lambda self, key: float('inf'),})
Run Code Online (Sandbox Code Playgroud)

现在你可以__getitem__直接使用:

>>> min(lst, key=mydict(dct).__getitem__)
'y'
>>> 
Run Code Online (Sandbox Code Playgroud)

相同的mydict类型可以通过以下方式继承:

class mydict(dict):
    def __missing__(self, key):
        return float('inf')
Run Code Online (Sandbox Code Playgroud)

它也会起作用。