2015-12-08 1 views
1

Tous,éléments du dictionnaire de tri python par valeur, puis la clé

J'ai des difficultés à trier un dictionnaire par valeur, puis à imprimer.

Mon objet (dataSet) ressemble à ce qui suit ...

dict_items([(0, {'studentName': 'dan', 'Score': 80.0}), (1, {'studentName': 'rob', 'Score': 92.0})]) 

Je voudrais trier par Score et imprimer, mais je suis échoue lamentablement. J'ai utilisé la méthode suivante comme conseillé de trier par StudentName, si c'est utile.

entries = sorted([(dataSet[entry]['studentName'], dataSet[entry]['Score']) for entry in dataSet]) 
    for name, score in entries: 
    print(('Student: {} -- Score: {}%'.format(name, score))) 
+0

pouvons-nous voir le contenu de dataSet? –

+0

Tri par score, puis les noms ne fonctionnera probablement pas à moins que vous allez avoir des plages de scores que vous pouvez trier les noms. – SirParselot

+0

@AyushShanker édité pour le rendre plus évident. –

Répondre

2
MyDict = {0: {'Score': 80.0, 'studentName': 'dan'}, 
      1: {'Score': 92.0, 'studentName': 'rob'}, 
      2: {'Score': 10.0, 'StudentName': 'xyz'}} 

Ceci renvoie la liste des paires clé-valeur dans la dictio naire, triés par valeur du plus haut au plus bas:

sorted(MyDict.items(), key=lambda x: x[1], reverse=True) 

Pour le dictionnaire trié par clé, utilisez ce qui suit:

sorted(MyDict.items(), reverse=True) 

Le retour est une liste de tuples, car les dictionnaires eux-mêmes ne peuvent pas être classés .

Ceci peut être imprimé ou envoyé dans un autre calcul.

0

Si tout ce que vous avez besoin est une liste de clés classées par ordre décroissant Score:

d = {0: {'Score': 80.0, 'studentName': 'dan'}, 
    1: {'Score': 92.0, 'studentName': 'rob'}, 
    2: {'Score': 10.0, 'studentName': 'xyz'}} 

sorted(d, key=lambda k: d[k]['Score']) 

produit

[2, 0, 1] 

Sinon, vous pouvez utiliser un dictionnaire ordonné

from collections import OrderedDict 
od = OrderedDict(sorted(d.items(), key=lambda i: i[1]['Score'])) 

qui vous donne

OrderedDict([(0, {'Score': 80.0, 'studentName': 'dan'}), (1, {'Score': 92.0, 'studentName': 'rob'})]) 

que vous pouvez imprimer bien

for v in od.values(): 
    print(v['Score'], v['studentName']) 

10.0 xyz 
80.0 dan 
92.0 rob 
+0

cela répondrait-il à vos besoins? – Pynchia

0

en supposant que votre objet est un list de tuples de dicts (plus proche interprétation que je peux atteindre via les données fournies), cela suffirait:

>>> dict_items = [(0, {'Score': 80.0, 'studentName': 'dan'}), (1, {'Score': 92.0, 'studentName': 'rob' 
})] 
>>> sorted(dict_items, key=lambda x: x[1]['Score']) 
# [(0, {'Score': 80.0, 'studentName': 'dan'}), (1, {'Score': 92.0, 'studentName': 'rob' 
})] 
0

Une autre méthode est au-dessous, peut-être quelqu'un a besoin:

d = {0: {'Score': 80.0, 'studentName': 'dan'}, 
    1: {'Score': 92.0, 'studentName': 'rob'}, 
    2: {'Score': 10.0, 'StudentName': 'xyz'}} 

sorted(d, cmp = lambda a,b: cmp(d[a]['Score'],d[b]['Score'])) 
0

Je voudrais simplement utiliser:

def comp(x,y): 
    if x[1]['Score'] != y[1]['Score']: 
     return 1 if x[1]['Score'] > y[1]['Score'] else -1 
    elif x[1]['studentName'] < y[1]['studentName']: 
     return -1 
    elif x[1]['studentName'] > y[1]['studentName']: 
     return 1 
    else: 
     return 0 

puis

sorted(dict_items, comp) 

Par exemple, pour

dict_items = [(0, {'Score': 80.0, 'studentName': 'dan'}), 
       (1, {'Score': 92.0, 'studentName': 'rob'}), 
       (2, {'Score': 70.0, 'studentName': 'foo'})] 

donne:

[(2, {'Score': 70.0, 'studentName': 'foo'}), (0, {'Score': 80.0, 'studentName': 'dan'}), 
(1, {'Score': 92.0, 'studentName': 'rob'})] 

Mais méfiez-vous : le titre de votre question portait sur DICTIONNAIRE articles. La réponse est cohérente avec le code de la question mais ne fait que trier une liste de tuples. Si vous avez vraiment un dict d, vous devez utiliser sorted(d.items())