python对值列表进行排名,使用非唯一值的平均排名

标签 python

是否有更 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/

相关文章:

python - PYTHONOPTIMIZE 在 python 解释器中做什么?

python - 如何正确循环并替换字符串中的元素?

python - Django:按*仅*年份值过滤日期时间字段?

python - 如何打印单位矩阵的行

python shuffle算法性能

python - python - 如何使python单元测试在从不同的工作目录运行时始终找到测试数据文件?

python - 你如何检查传递给函数的任何参数是否为 None?

python - Django 属性错误

python - 使用括号的正则表达式模式 '[]'

python - 有没有办法从 SCons 中的构建器调用的 python 函数获取返回值?