我创建了一个以列表为值的字典,其中包含一些参数。这些参数大多是浮点数或整数,有时是布尔值(在我的情况下存储为 0 或 1)。现在我想选择dict的最佳条目(=具有最高参数)
出于这个原因,我需要对参数进行规范化,以便每个参数仅在 0...1 的范围内。一种天真的方法是为每个列表“列”创建一个最大值列表,然后将所有值除以这个最大值:
import heapq
a = {1: [1.0, 23.7, 17.5, 0.2],
2: [0.0, 87.3, 11.2, 0.5],
3: [1.0, 17.4, 15.2, 0.7]}
ran = len(a.values()[0])
max = [0.0 for i in range(0,ran)]
for vals in a.values():
max = [max[x] if max[x] > vals[x] else vals[x] for x in range(0,ran)]
a = {k : [v[x]/max[x] for x in range(0,ran)] for k,v in a.items()}
best = heapq.nlargest(1, (v for v in a.values()), key=lambda v: sum(v))
print a
print best
这似乎在这里工作,但我可以从这里进行任何优化吗?我必须处理的 dicts 将包含超过 1000 个条目,参数将在 20 到 50 的范围内。我还需要对大约 1000 组 dicts 执行此操作,因此快速方法会有很大帮助。
编辑:我现在用生成的数据对其进行了测试:
import heapq
import random
def normalise(a):
ran = len(a.values()[0])
max = [0.0 for i in range(0,ran)]
for vals in a.values():
max = [max[x] if max[x] > vals[x] else vals[x] for x in range(0,ran)]
a = {k : [v[x]/max[x] for x in range(0,ran)] for k,v in a.items()}
# find best list
best = heapq.nlargest(1, (v for v in a.values()), key=lambda v: sum(v))
# test this 1000 times
for _ in xrange(1000):
a = { k: [1000.0*random.random() for i in xrange(50)] for k in xrange(1000)}
normalise(a)
并得到以下结果:
25,84s user 0,02s system 49% cpu 52,189 total, running python normalise.py