Эффективный способ найти самый большой ключ в словаре с ненулевым значением - PullRequest
6 голосов
/ 12 октября 2009

Я новый Python и пытаюсь реализовать код более Pythonic и эффективным способом. Учитывая словарь с числовыми ключами и значениями, как лучше всего найти самый большой ключ с ненулевым значением?

Спасибо

Ответы [ 4 ]

13 голосов
/ 12 октября 2009

Примерно так должно быть достаточно быстро:

>>> x = {0: 5, 1: 7, 2: 0}
>>> max(k for k, v in x.iteritems() if v != 0)
1

(удаление != 0 будет еще немного быстрее, но несколько затеняет смысл.)

10 голосов
/ 12 октября 2009

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

max(x.iterkeys())

Чтобы отфильтровать те, у которых значение равно 0, вы можете использовать выражение генератора :

(k for k, v in x.iteritems() if v != 0)

Вы можете комбинировать их, чтобы получить то, что вы ищете (поскольку max принимает только один аргумент, скобки вокруг выражения генератора могут быть удалены):

max(k for k, v in x.iteritems() if v != 0)
1 голос
/ 12 октября 2009

Функция макс Python принимает параметр key= для функции "measure".

data = {1: 25, 0: 75}
def keymeasure(key):
    return data[key] and key

print max(data, key=keymeasure)

Использование встроенной лямбды для того же эффекта и той же привязки локальных переменных:

print max(data, key=(lambda k: data[k] and k))

последняя альтернатива привязки в локальной переменной к функции анонимного ключа

print max(data, key=(lambda k, mapping=data: mapping[k] and k))
0 голосов
/ 12 октября 2009

Если бы я был вами, и скорость была бы большой проблемой, я бы, вероятно, создал бы новый контейнерный класс "DictMax", который бы отслеживал его самые большие элементы с ненулевым значением, имея внутренний стек индексов, где Элементом стека всегда является ключ самого большого элемента в словаре. Таким образом, вы получите самый большой элемент в постоянном времени каждый раз.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...