我有一个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 :(得分: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)
的元素可以播放时才有效。