Python排名字典返回排名

时间:2015-05-17 02:01:58

标签: python

我有一个python字典:

x = {'a':10.1,'b':2,'c':5}

如何进行排名并返回排名值?喜欢回来:

res = {'a':1,c':2,'b':3}

由于

编辑:

我没有尝试排序,因为可以通过python中的sorted函数来完成。我更考虑将等级值从最高到最小......所以在排序后用字符值替换字典值。 1表示最高,3表示最低。

7 个答案:

答案 0 :(得分:11)

如果我理解正确,您只需使用sorted获取订单,然后enumerate对其进行编号:

>>> x = {'a':10.1, 'b':2, 'c':5}
>>> sorted(x, key=x.get, reverse=True)
['a', 'c', 'b']
>>> {key: rank for rank, key in enumerate(sorted(x, key=x.get, reverse=True), 1)}
{'b': 3, 'c': 2, 'a': 1}

请注意,这假设排名是明确的。如果你有联系,绑定键之间的排名顺序将是任意的。使用类似方法也很容易处理,例如,如果您希望所有绑定的键具有相同的等级。我们有

>>> x = {'a':10.1, 'b':2, 'c': 5, 'd': 5}
>>> {key: rank for rank, key in enumerate(sorted(x, key=x.get, reverse=True), 1)}
{'a': 1, 'b': 4, 'd': 3, 'c': 2}

>>> r = {key: rank for rank, key in enumerate(sorted(set(x.values()), reverse=True), 1)}
>>> {k: r[v] for k,v in x.items()}
{'a': 1, 'b': 3, 'd': 2, 'c': 2}

答案 1 :(得分:0)

首先按字典顺序排序,然后分配排名。确保排序颠倒,然后用排名重新创建dict。

来自上一个答案:

import operator
x={'a':10.1,'b':2,'c':5}
sorted_x = sorted(x.items(), key=operator.itemgetter(1), reversed=True)
out_dict = {}
for idx, (key, _) in enumerate(sorted_x):
    out_dict[key] = idx + 1
print out_dict

答案 2 :(得分:0)

你可以这样做,

>>> x = {'a':10.1,'b':2,'c':5}
>>> m = {}
>>> k = 0
>>> for i in dict(sorted(x.items(), key=lambda k: k[1], reverse=True)):
        k += 1
        m[i] = k


>>> m
{'a': 1, 'c': 2, 'b': 3}

答案 3 :(得分:0)

漂亮简单排序简单但有点复杂的单行。

{key[0]:1 + value for value, key in enumerate(
                       sorted(d.iteritems(),
                              key=lambda x: x[1],
                              reverse=True))}

让我引导你完成它。

  • 我们使用enumerate为我们提供元素的自然排序,这是从零开始的。简单地使用enumerate(d.iteritems())将生成包含整数的元组列表,然后是包含原始字典中的键:值对的元组。
  • 我们对列表进行排序,使其按从高到低的顺序显示。
  • 我们希望将该值视为枚举值(也就是说,我们希望0为' a'如果只有一次出现(并且我会得到)将这一点归一化,等等),我们希望密钥是字典中的实际密钥。所以在这里,我们交换了我们绑定这两个值的顺序。
  • 当提取实际密钥时,它仍然是元组形式 - 它显示为('a', 0),所以我们只希望从中获取第一个元素。 key[0]完成了这一点。
  • 当我们想要获得实际值时,我们会对其排名进行标准化,使其基于1而不是从零开始,因此我们将{1}添加到value

答案 4 :(得分:0)

In [23]: from collections import OrderedDict

In [24]: mydict=dict([(j,i) for i, j in enumerate(x.keys(),1)])

In [28]: sorted_dict = sorted(mydict.items(), key=itemgetter(1))

In [29]: sorted_dict
Out[29]: [('a', 1), ('c', 2), ('b', 3)]
In [35]: OrderedDict(sorted_dict)
Out[35]: OrderedDict([('a', 1), ('c', 2), ('b', 3)])

答案 5 :(得分:0)

一种方法是检查字典中的最大值,然后删除它,同时构建一个新字典:

my_dict = x = {'a':10.1,'b':2,'c':5}
i = 1
new_dict ={}
while len(my_dict) > 0:
    my_biggest_key = max(my_dict, key=my_dict.get)
    new_dict[my_biggest_key] = i
    my_dict.pop(my_biggest_key)
    i += 1
print new_dict

答案 6 :(得分:0)

使用scipy.stats.rankdata

[ins] In [55]: from scipy.stats import rankdata                                                                                                                                                        

[ins] In [56]: x = {'a':10.1, 'b':2, 'c': 5, 'd': 5}                                                                                                                                                   

[ins] In [57]: dict(zip(x.keys(), rankdata([-i for i in x.values()], method='min')))                                                                                                                   
Out[57]: {'a': 1, 'b': 4, 'c': 2, 'd': 2}

[ins] In [58]: dict(zip(x.keys(), rankdata([-i for i in x.values()], method='max')))                                                                                                                   
Out[58]: {'a': 1, 'b': 4, 'c': 3, 'd': 3}

@ beta,@ DSM scipy.stats.rankdata还有其他一些关于联系的“方法”,这些方法可能更适合您想要进行联系的事情。