Вернуть максимальное значение из словаря

Я хочу вернуть максимальное значение и его ключ из словаря, и я знаю, что что-то вроде следующего должно помочь

max(list.iteritems(), key=operator.itemgetter(1))

Однако в случае, если максимальное значение в словаре равно 6, и случается так, что несколько ключей имеют одинаковое значение... он всегда будет возвращать первый! как я могу заставить его возвращать все ключи с максимальным числом в качестве значений вместе со значением. Вот пример словаря с таким же максимальным значением:

dic={0: 1.4984074067880424, 1: 1.0984074067880423, 2: 1.8984074067880425, 3: 2.2984074067880425, 4: 2.2984074067880425}

person Ophilia    schedule 04.02.2017    source источник


Ответы (2)


Решение с использованием понимания списка:

dic={0: 1.4984074067880424, 1: 1.0984074067880423, 2: 1.8984074067880425, 3: 2.2984074067880425, 4: 2.2984074067880425}
max_value = max(dic.values())  # maximum value
max_keys = [k for k, v in dic.items() if v == max_value] # getting all keys containing the `maximum`

print(max_value, max_keys)

Выход:

2.2984074067880425 [3, 4]
person RomanPerekhrest    schedule 04.02.2017
comment
Что делать, если два значения абсолютно одинаковы, и у вас нет выбора поиска по значению? - person Ahmed; 28.07.2019
comment
Это ничья, любой алгоритм max() должен иметь какое-то разрешение галстука, может быть, функция лямбда? @Ахмед - person Felipe Valdes; 02.02.2020

Сначала вы можете определить максимум с помощью:

maximum = max(dic.values())

а затем filter исходя из максимального значения:

result = filter(lambda x:x[1] == maximum,dic.items())

Пример в командной строке:

$ python2
Python 2.7.12 (default, Nov 19 2016, 06:48:10) 
[GCC 5.4.0 20160609] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> dic={0: 1.4984074067880424, 1: 1.0984074067880423, 2: 1.8984074067880425, 3: 2.2984074067880425, 4: 2.2984074067880425}
>>> maximum=max(dic.values())
>>> maximum
2.2984074067880425
>>> result = filter(lambda x:x[1] == maximum,dic.items())
>>> result
[(3, 2.2984074067880425), (4, 2.2984074067880425)]

Учитывая, что вы хотите представить список ключей как хороший список и значение, вы можете определить функцию:

def maximum_keys(dic):
    maximum = max(dic.values())
    keys = filter(lambda x:dic[x] == maximum,dic.keys())
    return keys,maximum

который возвращает кортеж, содержащий список ключей и максимальное значение:

>>> maximum_keys(dic)
([3, 4], 2.2984074067880425)
person Willem Van Onsem    schedule 04.02.2017