В 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, то распаковка преобразования вызывает
blockquote>NullPointerException
Можно использовать 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'
key, value = max(stats.iteritems(), key=lambda x:x[1])
, Если бы Вы не заботитесь о значении (я был бы удивлен, но) можно сделать:
key, _ = max(stats.iteritems(), key=lambda x:x[1])
мне нравится кортеж, распаковывающий лучше, чем [0] нижний индекс в конце выражения. Я никогда не люблю удобочитаемости лямбда-выражений очень, но нахожу этого лучше, чем operator.itemgetter (1), по моему скромному мнению.
Вот другой:
stats = {'a':1000, 'b':3000, 'c': 100}
max(stats.iterkeys(), key=lambda k: stats[k])
функция key
просто возвраты значение, которое должно использоваться для рейтинга и max()
возвраты потребованный элемент сразу же.
Я не был удовлетворен ни одним из этих ответов. max
всегда выборы первый ключ с макс. значением. Словарь мог иметь несколько ключей с тем значением.
def keys_with_top_values(my_dict):
return [key for (key, value) in my_dict.items() if value == max(my_dict.values())]
Регистрация этого ответа в случае, если это выручает кого-то. Посмотрите ниже ТАК сообщения