Python - 字典 - 最大值和根据函数和 for 循环的键

Python - Dictionary - max value and according key with function and for-loop

我想从具有函数和 for 循环的字典中获取最大值和根据键。这是我的代码:

Autolager = {'Audi' : 9, 'BMW' : 11, 'Mercedes' : 8}

def Maxlagerbestand(Autolager):  
    MaxAutoValue = 0  
    MaxAutoName = None  
    for i in Autolager:  
        if Autolager[i] > MaxAutoValue:  
            MaxAutoValue = Autolager[i]  
            MaxAutoName = [k for k, v in Autolager.items() if v == MaxAutoValue]  
        return (MaxAutoValue, MaxAutoName)      
print (Maxlagerbestand(Autolager))

然后输出是 (9, ['Audi']) 但它应该是 (11, ['BMW])

我连功能都查过了:

MaxAutoValue = 0  
for i in Autolager:  
    if Autolager[i] > MaxAutoValue:  
        MaxAutoValue = Autolager[i]  
print (MaxAutoValue)

此处输出正确地给出了 11。

我上面的代码哪里出了问题?感谢您的任何提示。

您将 return (MaxAutoValue, MaxAutoName) 放在 for 循环中,而不是在 for 循环完成之后。

Autolager = {'Audi' : 9, 'BMW' : 11, 'Mercedes' : 8}

def Maxlagerbestand(Autolager):  
    MaxAutoValue = 0  
    MaxAutoName = None  
    for i in Autolager:  
        if Autolager[i] > MaxAutoValue:  
            MaxAutoValue = Autolager[i]  
            MaxAutoName = [k for k, v in Autolager.items() if v == MaxAutoValue]  
    return (MaxAutoValue, MaxAutoName)      
print (Maxlagerbestand(Autolager))

此外,我不确定您要用 [k for k, v in Autolager.items() if v == MaxAutoValue] 做什么。将其替换为 i[i] 不是更容易吗?

一个经典的:你 立即 return 在 for 循环的末尾。所以这意味着你 return 在 第一次 迭代后的结果最大值。因此,它尚未评估 all 个元素。

也就是说,使用 max(..):

可以改善很多
from operator import itemgetter

max_kv = max(autolager.items(), key=itemgetter(1))

这将导致包含具有最大值的键值组合的二元组,因此:

>>> max(autolager.items(), key=itemgetter(1))
('BMW', 11)

如果你想获得所有键值,我们可以通过字典做第二个运行:

from operator import itemgetter

def maxlagerbestand(autolager):
    max_v = max(autolager.values())
    return max_v, [k for k, v in autolager.items() if v == max_v]

这里这个然后 returns:

>>> maxlagerbestand(autolager) 
(11, ['BMW']) 

对于空字典({}),上面的代码会出错。我们可以将 default= 值添加到 max(..) 到 return 给定字典为空的值:

def maxlagerbestand(autolager):
    max_v = max(autolager.values()<b>, default=None</b>)
    return max_v, [k for k, v in autolager.items() if v == max_v]

对于空字典,这将 return:

>>> maxlagerbestand({}) 
(None, []) 

尽管 Mark 的回答可行,但您可以简化代码

Autolager = {'Audi' : 9, 'BMW' : 11, 'Mercedes' : 8}

def Maxlagerbestand(Autolager):  
    MaxAutoValue = 0  
    MaxAutoName = None  
    for key, value in Autolager.items():  
        if value > MaxAutoValue:  
            MaxAutoValue = value 
            MaxAutoName = key 
    return (MaxAutoValue, MaxAutoName)  

print (Maxlagerbestand(Autolager))