Что-то вроде этого должно быть достаточно быстрым:
>>> x = {0: 5, 1: 7, 2: 0}
>>> max(k for k, v in x.iteritems() if v != 0)
1
(удаление ! = 0
будет еще немного быстрее, но несколько скрывает смысл.)
Чтобы получить самый большой ключ, вы можете использовать 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)
Функция Python max принимает параметр key =
для функции «измерения».
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))
Если бы я был на вашем месте и скорость была бы большой проблемой, я бы, вероятно, создал новый класс контейнера "DictMax", который отслеживал бы его самые большие элементы с ненулевым значением, имея внутренний стек индексов, где верхний элемент стека всегда является ключом самого большого элемента в словаре. Таким образом вы всегда будете получать самый большой элемент в постоянное время.