按键对列表进行排序,并在不重新计算的情况下获取值

时间:2015-08-22 21:58:04

标签: python sorting

我有一个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])]

这有效,但有点令人困惑,而且不是特别易读。

实现这一目标的最佳途径是什么?

2 个答案:

答案 0 :(得分:3)

functools.lru_cache在这里可能很有用。与文档中一样:

  

Decorator用一个memoizing callable来包装一个函数,该函数可以保存maxsize最近的调用。当使用相同的参数定期调用昂贵的或I / O绑定函数时,它可以节省时间。

简单地说,将lru_cache添加到您的函数中:

@lru_cache(maxsize=32)
def score(i):
    ...

答案 1 :(得分:2)

创建字典,将密钥作为HowMany中的元素,相应的值将为l

scores

然后使用>>> scores = {el: score(el) for el in l} 作为scores.get,就像这样

key

注意:此技术仅在>>> sorted(l, key=scores.get) 的元素可以播放时才有效。