web-dev-qa-db-fra.com

Comment trier un dict Python par valeur

J'ai un dict qui ressemble à ceci

{ "keyword1":3 , "keyword2":1 , "keyword3":5 , "keyword4":2 }

Et je voudrais convertir DESC et créer une liste de seulement les mots-clés. Par exemple, cela reviendrait

["keyword3" , "keyword1" , "keyword4" , "keyword2"]

Tous les exemples que j'ai trouvés utilisent lambda et je ne suis pas très fort avec ça. Existe-t-il un moyen de passer en revue ceci et de les trier au fur et à mesure ? Merci pour toutes les suggestions.

PS: Je pourrais créer le dict initial de manière différente si cela pouvait aider.

20
Shane Reustle

Vous pourriez utiliser

res = list(sorted(theDict, key=theDict.__getitem__, reverse=True))

(Vous n'avez pas besoin de list dans Python 2.x)

Le theDict.__getitem__ est en fait équivalent à lambda x: theDict[x].

(Un lambda n’est qu’une fonction anonyme. Par exemple

>>> g = lambda x: x + 5
>>> g(123)
128

Ceci est équivalent à

>>> def h(x):
...   return x + 5
>>> h(123)
128

)

43
kennytm
>>> d={ "keyword1":3 , "keyword2":1 , "keyword3":5 , "keyword4":2 }
>>> sorted(d, key=d.get, reverse=True)
['keyword3', 'keyword1', 'keyword4', 'keyword2']
18
John La Rooy

je l'ai toujours fait de cette façon .... Y a-t-il des avantages à utiliser la méthode triée?

keys = dict.keys()
keys.sort( lambda x,y: cmp(dict[x], dict[y]) )

whoops n'a pas lu la partie sur le fait de ne pas utiliser lambda = (

2
JiminyCricket

Je proposerais quelque chose comme ça:

[k for v, k in sorted(((v, k) for k, v in theDict.items()), reverse=True)]

Mais La solution de KennyTM est beaucoup plus agréable :)

2
Messa

Il n'est pas possible de trier un dict, mais uniquement d'obtenir une représentation d'un dict qui est trié. Les dictus sont par nature moins ordonnés, mais d'autres types, tels que les listes et les n-uplets, ne le sont pas. Vous avez donc besoin d'une représentation triée, qui sera une liste - probablement une liste de n-uplets. Par exemple,

'''
Sort the dictionary by score. if the score is same then sort them by name 
{ 
 'Rahul'  : {score : 75} 
 'Suhas' : {score : 95} 
 'Vanita' : {score : 56} 
 'Dinesh' : {score : 78} 
 'Anil'  : {score : 69} 
 'Anup'  : {score : 95} 
} 
'''
import operator

x={'Rahul' : {'score' : 75},'Suhas' : {'score' : 95},'Vanita' : {'score' : 56}, 
   'Dinesh' : {'score' : 78},'Anil' : {'score' : 69},'Anup' : {'score' : 95} 
  }
sorted_x = sorted(x.iteritems(), key=operator.itemgetter(1))
print sorted_x

sortie:

[('Vanita', {'score': 56}), ('Anil', {'score': 69}), ('Rahul', {'score': 75}), ('Dinesh', {'score': 78}), ('Anup', {'score': 95}), ('Suhas', {'score': 95})]
1
Sagar Pise