Предпочитаете ключ по максимальному значению в словаре? - PullRequest
0 голосов
/ 07 декабря 2018

Вы можете получить ключ с максимальным значением в словаре таким образом max (d, key = d.get).Вопрос, когда у двух или более ключей есть максимум, как вы можете установить предпочтительный ключ.

Я нашел способ сделать это, добавив ключ с цифрой.

Есть ли лучший способ?

In [56]: d = {'1a' : 5, '2b' : 1, '3c' : 5 }

In [57]: max(d, key=d.get)
Out[57]: '1a'

In [58]: d = {'4a' : 5, '2b' : 1, '3c' : 5 }

In [59]: max(d, key=d.get)
Out[59]: '3c'

Ответы [ 3 ]

0 голосов
/ 07 декабря 2018

Эта идея похожа на @ решение AxelPuig .Но вместо того, чтобы полагаться на вспомогательный словарь каждый раз, когда вы хотите получить элемент со значением max или min, вы можете выполнить одну сортировку и использовать collections.OrderedDict:

from collections import OrderedDict

d = {'a' : 5, 'b' : 1, 'c' : 5 }

d_preference1 = {'a': 1, 'b': 2, 'c': 3}
d_preference2 = {'a': 3, 'b': 2, 'c': 1}

d1 = OrderedDict(sorted(d.items(), key=lambda x: -d_preference1[x[0]]))
d2 = OrderedDict(sorted(d.items(), key=lambda x: -d_preference2[x[0]]))

max(d1, key=d.get)  # c
max(d2, key=d.get)  # a

Поскольку OrderedDict является подклассом dict, обычно нет необходимости преобразовывать в обычный dict.Если вы используете Python 3.7+, вы можете использовать обычный конструктор dict, так как словари имеют порядок вставки .

Как отмечено в документах для max:

Если максимальное количество элементов максимально, функция возвращает первый найденный элемент.

0 голосов
/ 07 декабря 2018

Небольшое отклонение от ответа @ AxelPuig.Вы фиксируете порядок ключей в списке priorities и берете максимум с помощью key=d.get.

d = {"1a": 5, "2b": 1, "3c": 5}
priorities = list(d.keys())

print(max(priorities, key=d.get))
0 голосов
/ 07 декабря 2018

Функция, указанная в аргументе key, может возвращать кортеж.Второй элемент кортежа будет использоваться, если есть несколько максимумов для первого элемента.При этом вы можете использовать нужный метод, например, с двумя словарями:

d = {'a' : 5, 'b' : 1, 'c' : 5 }
d_preference = {'a': 1, 'b': 2, 'c': 3}
max(d, key=lambda key: (d[key], d_preference[key]))
# >> 'c'

d_preference = {'a': 3, 'b': 2, 'c': 1}
max(d, key=lambda key: (d[key], d_preference[key]))
# >> 'a'
...