按分数对字典排序。如果得分相同,则按名称排序
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})]
现在我想按名称对最后两个元素进行排序,因为它的分数相同。
答案 0 :(得分:5)
小心,你的代码实际上是在比较dicts本身而不是分数。即
{'score': 56} < {'score': 69}
如果词典中有额外的键,可能会引起意外。您可以安排key
func返回tuple
和score
的{{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})]