Получение ключа с максимальным значением в словаре?

В i == 0 Java попытается выполнить автоматическое распаковку и выполнить численное сравнение (т.е. «это значение, хранящееся в объекте-обертке, на которое ссылается i, такое же, как значение 0?»).

Так как i - null, то распаковка будет вызывать NullPointerException.

Обоснование выглядит следующим образом:

Первое предложение JLS § 15.21.1 Операторы числового равенства == и! = читаются следующим образом:

Если операнды оператора равенства являются как числовыми, либо одно из числового типа и (§5.6.2).

blockquote>

Ясно, что i конвертируется в числовой тип и 0 является числовым типом, поэтому двоичная цифровая продвижение выполняется в операндах.

§ 5.6.2 Двоичное числовое продвижение говорит (между прочим):

Если какой-либо из операндов имеет ссылочный тип, выполняется преобразование распаковки (п. 5.1.8).

blockquote>

§ 5.1.8 Конвертирование Unboxing говорит (среди прочего):

Если r равно null, то распаковка преобразования вызывает NullPointerException

blockquote>

731
задан Darshana 29 May 2013 в 11:39
поделиться

5 ответов

Можно использовать operator.itemgetter для этого:

import operator
stats = {'a':1000, 'b':3000, 'c': 100}
max(stats.iteritems(), key=operator.itemgetter(1))[0]

И вместо того, чтобы создать новый список в использовании памяти stats.iteritems(). key параметр к эти max() функция является функцией, которая вычисляет ключ, который используется, чтобы определить, как оценить объекты.

Обратите внимание на то, что, если у Вас должна была быть другая пара "ключ-значение" 'd': 3000, который этот метод только возвратит один из два даже при том, что у них обоих есть максимальное значение.

>>> import operator
>>> stats = {'a':1000, 'b':3000, 'c': 100, 'd':3000}
>>> max(stats.iteritems(), key=operator.itemgetter(1))[0]
'b' 

При использовании Python3:

>>> max(stats.items(), key=operator.itemgetter(1))[0]
'b'
518
ответ дан Priyanka Chaudhary 29 May 2013 в 11:39
поделиться
key, value = max(stats.iteritems(), key=lambda x:x[1])

, Если бы Вы не заботитесь о значении (я был бы удивлен, но) можно сделать:

key, _ = max(stats.iteritems(), key=lambda x:x[1])

мне нравится кортеж, распаковывающий лучше, чем [0] нижний индекс в конце выражения. Я никогда не люблю удобочитаемости лямбда-выражений очень, но нахожу этого лучше, чем operator.itemgetter (1), по моему скромному мнению.

34
ответ дан Davoud Taghawi-Nejad 29 May 2013 в 11:39
поделиться

Вот другой:

stats = {'a':1000, 'b':3000, 'c': 100}
max(stats.iterkeys(), key=lambda k: stats[k])

функция key просто возвраты значение, которое должно использоваться для рейтинга и max() возвраты потребованный элемент сразу же.

37
ответ дан user994998 29 May 2013 в 11:39
поделиться
max(stats, key=stats.get)
929
ответ дан A. Coady 29 May 2013 в 11:39
поделиться

Я не был удовлетворен ни одним из этих ответов. max всегда выборы первый ключ с макс. значением. Словарь мог иметь несколько ключей с тем значением.

def keys_with_top_values(my_dict):
    return [key  for (key, value) in my_dict.items() if value == max(my_dict.values())]

Регистрация этого ответа в случае, если это выручает кого-то. Посмотрите ниже ТАК сообщения

, Какой максимум Python выбирает в случае связи?

6
ответ дан 22 November 2019 в 21:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: