【问题标题】:Python - Dictionary - max value and according key with function and for-loopPython - 字典 - 最大值并根据键与函数和for循环
【发布时间】:2019-03-23 02:33:20
【问题描述】:

我想从带有函数和 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 给出。

我上面的代码出了什么问题?我很感谢任何提示。

【问题讨论】:

  • 您在for 循环结束时立即返回。

标签: python function dictionary for-loop key-value


【解决方案1】:

您将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] 替换它不是更容易吗?

【讨论】:

  • 啊,我明白了。我猜我自己可能已经看到了。非常感谢您的帮助!它现在正在工作。我还将变量 MaxAutoName 的值更改为 i,它也工作得很好。
【解决方案2】:

一个经典的例子:您立即for 循环结束时返回。这意味着您在 first 迭代之后返回结果最大值。因此它尚未评估所有元素。

话虽如此,使用max(..) 可以大大改善这一点:

from operator import itemgetter

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

这将产生一个包含具有最大值的键值组合的 2 元组,因此:

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

如果你想获得 all 具有此值的键,我们可以通过字典进行第二次运行:

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]

这里返回:

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

对于空字典 ({}),以上将出错。我们可以在max(..) 中添加一个default= 值,以在字典为空的情况下返回一个值:

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

对于空字典,这将返回:

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

【讨论】:

  • 也感谢您的建议。我还尝试了该问题的 max 函数,它运行良好。只是想挑战自己,用 for 循环来完成,因为我对 python 和编程完全陌生。
【解决方案3】:

虽然 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))

【讨论】:

  • 也感谢您的建议。我尝试过,但必须将 v 和 k 更改为 value 和 key,才能使其正常工作。否则它会告诉我 v 和 k 没有定义。
  • @MikeTwain 你是对的我忘了用 k 和 v 替换键和值以使其更具可读性,我已经编辑了答案,谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-11-18
  • 2017-07-21
  • 2021-02-10
  • 1970-01-01
  • 2022-12-02
  • 1970-01-01
  • 2022-11-17
相关资源
最近更新 更多