2015-08-22 2 views
1

У меня есть функция score, и я хочу отсортировать список в соответствии с ним.Сортировка списка по ключу и извлечение значения без пересчета

Обычно, это легко (просто получите sorted(l, key=score)), но мне нужны оценки позже в коде, а score является дорогостоящим по вычислительной цене (поэтому я хочу избежать двойного выигрыша).


Вот мой текущий код:

scores= map(score, l) 
new_l= [el for i,el in sorted(enumerate(l), key=lambda (i,el): scores[i])] 

Это работает, но это немного сбивает с толку и не особенно читаемы.

Каков наилучший способ достичь этого?

+0

почему 'ключ = лямбда-я, эл:'? –

+1

@PadraicCunningham извините, это на самом деле '(i, el)', для распаковки кортежа – goncalopp

ответ

2

Создать словарь, с ключами, как ваши элементы из l и соответствующих значений будет scores

>>> scores = {el: score(el) for el in l} 

И затем использовать scores.get для key, как этот

>>> sorted(l, key=scores.get) 

Примечание: Этот метод будет работать только в том случае, если элементы l являются хешируемыми.

3

functools.lru_cache может быть здесь полезен. Как и в документах:

Декоратор для обертывания функции с помощью memoizing callable, которая экономит до максимальных последних вызовов. Это может сэкономить время, когда дорогостоящая или связанная с I/O функция периодически вызывается с теми же аргументами.

просто добавьте lru_cache к вашей функции:

@lru_cache(maxsize=32) 
def score(i): 
    ... 
Смежные вопросы