如果值相同,如何在字典中对键进行排序?

时间:2015-07-02 05:45:54

标签: python python-2.7 sorting dictionary

按分数对字典排序。如果得分相同,则按名称排序

import operator
dt={ 
'sudha'  : {'score' : 75} ,
'Amruta' : {'score' : 95} ,
'Ramesh' : {'score' : 56} ,
'Shashi' : {'score' : 78} ,
'Manoj'  : {'score' : 69} ,
'Resham'  : {'score' : 95} 
} 

sorted_x1 = sorted(dt.items(), key=operator.itemgetter(1))
print sorted_x1

输出是:

[('Ramesh', {'score': 56}), ('Manoj', {'score': 69}), 
 ('sudha', {'score':           75}), 
 ('Shashi', {'score': 78}),   ('Resham', {'score': 95}), ('Amruta',{'score': 95})]

现在我想按名称对最后两个元素进行排序,因为它的分数相同。

3 个答案:

答案 0 :(得分:5)

小心,你的代码实际上是在比较dicts本身而不是分数。即

{'score': 56} < {'score': 69}

如果词典中有额外的键,可能会引起意外。您可以安排key func返回tuplescore的{​​{1}}。

key

如果有人需要在Python3中执行此操作,则必须避免在sorted_x1 = sorted(dt.items(), key=lambda (k, v): (v['score'], k)) 中解压缩元组,因为不再允许这样做。

lambda

答案 1 :(得分:3)

您可以将要排序的元素作为元组或列表发送,并且首先在第一个元素上进行排序,如果第一个元素相同,它将移动到下一个元素。

示例 -

>>> dt={
... 'sudha'  : {'score' : 75} ,
... 'Amruta' : {'score' : 95} ,
... 'Ramesh' : {'score' : 56} ,
... 'Shashi' : {'score' : 78} ,
... 'Manoj'  : {'score' : 69} ,
... 'Resham'  : {'score' : 95}
... }
>>>
>>> sorted_x1 = sorted(dt.items(), key=lambda x: (x[1]['score'], x[0]))
>>> sorted_x1
[('Ramesh', {'score': 56}), ('Manoj', {'score': 69}), ('sudha', {'score': 75}), ('Shashi', {'score': 78}), ('Amruta', {'score': 95}), ('Resham', {'score': 95})]

答案 2 :(得分:1)

这是一种方法:

k = sorted(dt, key=dt.__getitem__)
v = sorted(dt.values())
sorted_dt_scores = zip(k,v)
打印sorted_dt_scores时输出

[('Ramesh', {'score': 56}), ('Manoj', {'score': 69}), ('sudha', {'score': 75}), ('Shashi', {'score': 78}), ('Resham', {'score': 95}), ('Amruta', {'score': 95})]