Python - Dictionary - максимальное значение и соответствующий ключ с функцией и циклом for - PullRequest
0 голосов
/ 18 октября 2018

Я хочу получить максимальное значение и соответствующий ключ из словаря с функцией и для цикла.Вот мой код:

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.

Что пошло не так в моем коде выше?Я благодарен за любые подсказки.

Ответы [ 3 ]

0 голосов
/ 18 октября 2018

Классический: вы немедленно возвращаетесь в конце цикла for.Таким образом, это означает, что вы возвращаете максимум результата после первой итерации.Таким образом, он еще не оценил все элементов.

При этом можно значительно улучшить это, используя max(..):

from operator import itemgetter

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

Это приведет к2-кортеж, содержащий комбинацию ключ-значение с наибольшим значением, поэтому:

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

, если вы хотите получить все ключи с этим значением, мы можем выполнить второй прогон черезthe dictionary затем:

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']) 

. Для пустого словаря ({}) вышеприведенная ошибка будет.Мы можем добавить default= значение к max(..), чтобы вернуть значение, если словарь пуст:

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]

Для пустого словаря это будет возвращать:

>>> maxlagerbestand({}) 
(None, []) 
0 голосов
/ 18 октября 2018

Хотя ответ Марка сработает, вы можете упростить код

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))
0 голосов
/ 18 октября 2018

Вы помещаете 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]?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...