您无法获得线性时间,但可以更快地完成。对我来说,这看起来像是一个矩阵乘法,所以我建议您使用
numpy:
import numpy as npkeys = ['key1', 'key2', 'key3']values = np.matrix([ [1.1, 1.2, 1.3, 1.4], [2.1, 2.2, 2.3, 2.4], [3.1, 3.2, 3.3, 3.4]])weights = np.matrix([[10., 20., 30., 40.]]).transpose()res = (values * weights).transpose().tolist()[0]items = zip(res, keys)items.sort(reverse=True)
这使
[(330.0, 'key3'), (230.0, 'key2'), (130.0, 'key1')]
编辑: 有感谢@Ondro为np.dot并以@unutbu为np.argsort,这里是numpy的完全的改进版本:
import numpy as np# set up valueskeys = np.array(['key1', 'key2', 'key3'])values = np.array([ [1.1, 1.2, 1.3, 1.4], # values1_x [2.1, 2.2, 2.3, 2.4], # values2_x [3.1, 3.2, 3.3, 3.4] # values3_x])weights = np.array([10., 20., 30., 40.])# crunch the numbersres = np.dot(values, -weights) # negative of weights!order = res.argsort(axis=0) # sorting on negative value gives # same order as reverse-sort; there does # not seem to be any way to reverse-sort # directlysortedkeys = keys[order].tolist()
结果是
['key3', 'key2', 'key1']。



