是否有更 pythonic 的、更快的想要按值对字典进行排名并对非唯一值进行平均排名。我的做法:
d = {'a':5,'b':5,'c':5,'d':1,'e':6}
ordered_keys = sorted(d, key=d.get)
ordered_v = [d[k] for k in ordered_keys]
value_rank = [(ordered_v.index(v)+1)+(ordered_v.count(v)-1)/2 for v in ordered_v]
ranked_key_list = zip(ordered_keys,value_rank)
[('d', 1), ('a', 3), ('c', 3), ('b', 3), ('e', 5)]
这个关于排序字典的广泛讨论非常有帮助:python dictionary values sorting
最佳答案
你算法的瓶颈是 .index 和 .count 是 O(n),因此你的瓶颈是这一行:
value_rank = [(ordered_v.index(v)+1)+(ordered_v.count(v)-1)/2 for v in ordered_v]
使你的整体性能为 O(n^2)
我已经为你做了一个 O(n*log(n)) 算法(瓶颈现在是排序):
import collections
d = {'a':5,'b':5,'c':5,'d':1,'e':6}
my_d = collections.defaultdict(list)
for key, val in d.items():
my_d[val].append(key)
ranked_key_list = []
n = v = 1
for _, my_list in sorted(my_d.items()):
v = n + (len(my_list)-1)/2
for e in my_list:
n += 1
ranked_key_list.append((e, v))
关于python对值列表进行排名,使用非唯一值的平均排名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13770523/