2015-07-02 49 views
2

按分數對字典進行排序。如果分數相同,則通過名稱對其進行排序如果數值相同,如何對字典中的鍵進行排序?

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})] 

現在我想排序由其名稱最後兩個元素,因爲它的分數是一樣的。

+5

'鍵= operator.itemgetter(1,0)' –

+0

@AshwiniChaudhary,再看一遍。 'itemgetter(1)'是從 –

+0

@JohnLaRooy Ouch建立起的一個糟糕的起點! –

回答

5

小心,你的代碼實際上是比較類型的字典本身,而不是分數。即

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

如果字典中有額外的鍵,可能會導致意外。您可以安排key函數返回和keytuple

sorted_x1 = sorted(dt.items(), key=lambda (k, v): (v['score'], k)) 

如果有人需要爲此在Python3,你必須避免的元組在lambda拆包爲不再允許。

sorted_x1 = sorted(dt.items(), key=lambda k_v: (k_v[1]['score'], k_v[0])) 
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})] 
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})] 
相關問題