У меня есть dictionary
: ключи являются строки, значения являются целыми числами.
Пример:
stats = {'a':1000, 'b':3000, 'c': 100}
Я бы хотел получить 'b'
ответ, так как это ключ с более высоким значением.
Я сделал следующее, используя промежуточный список с обратными кортежами ключ-значение:
inverse = [(value, key) for key, value in stats.items()]
print max(inverse)[1]
Это лучший (или даже более элегантный) подход?
python
dictionary
max
ricafeal
источник
источник
max(stats)
?max(stats)
будет использовать метки в качестве ключей (он вернет'c'
, учитывая, что это максимальная метка),max(stats, key=lambda key: stats[key])
то , что было после OP (которое вернет'b'
метку максимального индексированного значения). Это понятнее?Ответы:
Вы можете использовать
operator.itemgetter
для этого:И вместо построения нового списка в памяти используйте
stats.iteritems()
.key
Параметр вmax()
функции является функция , которая вычисляет ключ , который используется для определения того, как ранг элементов.Обратите внимание, что если бы у вас была другая пара ключ-значение 'd': 3000, этот метод вернет только один из двух, даже если они оба имеют максимальное значение.
Если вы используете Python3:
источник
max(stats.iterkeys(), key=(lambda key: stats[key]))
key=lambda x: x[1]
?max(stats, key=lambda key: stats[key])
источник
stats[max(stats, key=stats.get)]
max_value = max(stats.values()); {key for key, value in stats.items() if value == max_value}
Я протестировал МНОЖЕСТВО вариантов, и это самый быстрый способ вернуть ключ dict с максимальным значением:
Чтобы дать вам представление, вот несколько возможных методов:
Тестовый словарь:
И результаты теста под Python 3.2:
И под Python 2.7:
Вы можете видеть, что
f1
это самый быстрый под Python 3.2 и 2.7 (или, более полно,keywithmaxval
в верхней части этого поста)источник
f7
это какf1
, просто не давая имя промежуточному объекту.f7
должно быть (очень немного) быстрееf1
, не намного медленнее. И вот что я получаю:>>> timeit.timeit("f1()","from __main__ import f1, f7, d1", number=10000) 0.26785888786807277 >>> timeit.timeit("f7()","from __main__ import f1, f7, d1", number=10000) 0.26770628307832567
Если вам нужно знать только ключ с максимальным значением, вы можете сделать это без
iterkeys
илиiteritems
потому, что перебор словаря в Python - это перебор его ключей.РЕДАКТИРОВАТЬ:
Из комментариев @ user1274878:
Ага...
Максимум
Необязательный
key
аргумент описывает, как сравнивать элементы, чтобы получить максимум среди них:Возвращенные значения будут сравниваться.
Dict
Python dict - это хеш-таблица. Ключ dict - это хеш объекта, объявленного как ключ. Из-за соображений производительности итерация, хотя dict реализована как итерация по ключам.
Поэтому мы можем использовать его для избавления от операции получения списка ключей.
закрытие
stats
Переменная доступна через__closure__
атрибутlambda
функции как указатель на значение переменного , определенных в родительской области.источник
Пример:
если вы хотите найти максимальное значение с помощью его ключа, возможно, последующие могут быть простыми, без каких-либо соответствующих функций.
выход - это ключ, который имеет максимальное значение.
источник
Вот еще один:
Функция
key
просто возвращает значение, которое следует использовать для ранжирования, и сразу жеmax()
возвращает требуемый элемент.источник
max(stats, key=lambda k: stats[k])
Если вас не волнует ценность (я бы удивился, но), вы можете сделать:
Мне нравится распаковка кортежей лучше, чем индекс [0] в конце выражения. Мне никогда не нравилась читаемость лямбда-выражений, но я нашел это лучше, чем operator.itemgetter (1) IMHO.
источник
_
может быть использован вместоignored
.ignored
выглядит довольно некрасиво, но некоторые люди против использования_
по нескольким причинам. Я думаю, что первый фрагмент в порядке, даже если вы игнорируете значениеУчитывая, что более одной записи могут иметь максимальное значение. Я бы сделал список ключей, которые имеют максимальное значение в качестве значения.
Это даст вам 'b' и любой другой ключ макс.
Примечание: для Python 3 используйте
stats.items()
вместоstats.iteritems()
источник
max
были дорогими (например, LONG-словарь), я бы порекомендовал,[key for m in [max(stats.values())] for key,val in stats.iteritems() if val == m]
если вы хотите использовать одну строку, в противном случае вычисляйтеm = ...
заранее.Ты можешь использовать:
Для возврата ключа используйте пару значений:
источник
Чтобы получить максимальный ключ / значение словаря
stats
:>>> max(stats.items(), key = lambda x: x[0]) ('c', 100)
>>> max(stats.items(), key = lambda x: x[1]) ('b', 3000)
Конечно, если вы хотите получить только ключ или значение из результата, вы можете использовать индексирование кортежей. Например, чтобы получить ключ, соответствующий максимальному значению:
>>> max(stats.items(), key = lambda x: x[1])[0] 'b'
объяснение
Словарь метод
items()
в Python 3 возвращает объект представления словаря. Когда этот объект просмотра перебираетсяmax
функцией, он возвращает элементы словаря в виде кортежей формы(key, value)
.>>> list(stats.items()) [('c', 100), ('b', 3000), ('a', 1000)]
Когда вы используете
lambda
выражениеlambda x: x[1]
, в каждой итерации,x
является одним из этих кортежей(key, value)
. Таким образом, выбирая правильный индекс, вы выбираете, хотите ли вы сравнить по ключам или по значениям.Python 2
Для выпусков Python 2.2+ будет работать тот же код. Однако лучше использовать
iteritems()
словарный метод, а неitems()
для производительности.Ноты
Этот ответ основан на комментариях к ответу Climbs_lika_Spyder .
Использованный код был протестирован на Python 3.5.2 и Python 2.7.10.
источник
источник
По повторным решениям через комментарии в выбранном ответе ...
В Python 3:
В Python 2:
источник
Я попал сюда в поисках того, как вернуть
mydict.keys()
на основе стоимостиmydict.values()
. Вместо того , чтобы только один ключ вернулся, я искал , чтобы вернуть верхние й число значений.Это решение проще, чем использование
max()
функции, и вы можете легко изменить количество возвращаемых значений:Если вам нужен единственный ключ с самым высоким рейтингом, просто используйте индекс:
Если вы хотите получить два верхних ключа с самым высоким рейтингом, просто используйте нарезку списка:
источник
max()
. Понятно, что это самый быстрый. Я думал, что предложу другое решение с преимуществом нарезки, которое было более полезным для меня в то времяЯ не был удовлетворен ни одним из этих ответов.
max
всегда выбирает первый ключ с максимальным значением. Словарь может иметь несколько ключей с этим значением.Отправка этого ответа на случай, если он кому-то поможет. Смотрите ниже ТАК сообщение
Какой максимум выбирает Python в случае ничьей?
источник
С
collections.Counter
тобой можно сделатьЕсли уместно, вы можете просто начать с пустого
collections.Counter
и добавить к немуисточник
Очередь кучи - это обобщенное решение, которое позволяет вам извлечь верхние n ключей, упорядоченные по значению:
Примечание
dict.__getitem__
- это метод, вызываемый синтаксическим сахаромdict[]
. В противоположностьdict.get
, он вернется,KeyError
если ключ не найден, чего здесь не может быть.источник
max((value, key) for key, value in stats.items())[1]
источник
+1 к простейшему решению @Aric Coady .
А также один из способов случайного выбора одного из ключей с максимальным значением в словаре:
источник
источник
Как насчет:
источник
zip(stats.keys(), stats.values())
это просто более длинный способ написатьstats.items()
. Как только вы сделаете это изменение, ваш ответ будет практически идентичен нескольким более старым ответам.items
не то же самое, чтоzip
. Это просто дает тот же результат.Я проверил принятый ответ и самое быстрое решение AND @ thewolf с очень простым циклом, и цикл был быстрее, чем оба:
Результаты:
источник
Для научных пользователей Python вот простое решение с использованием Pandas:
источник
В случае если у вас есть несколько ключей с одинаковым значением, например:
Вы можете получить коллекцию со всеми ключами с максимальным значением следующим образом:
источник
Намного проще понять подход:
Вывод: ['a', 'g']
Теперь вы можете выбрать только один ключ:
источник