web-dev-qa-db-fra.com

trier dict par valeur python

Supposons que j'ai un dict.

data = {1:'b', 2:'a'}

Et je veux trier les données par 'b' et 'a' pour obtenir le résultat

'a','b'

Comment je fais ça?
Des idées?

70
kingRauk

Pour obtenir les valeurs, utilisez

sorted(data.values())

Pour obtenir les clés correspondantes, utilisez une fonction key

sorted(data, key=data.get)

Pour obtenir une liste de tuples commandés par valeur

sorted(data.items(), key=lambda x:x[1])

Connexes: voir la discussion ici: Les dictionnaires sont classés en Python 3.6+

150
John La Rooy

Si vous voulez réellement trier le dictionnaire au lieu d’obtenir une liste triée, utilisez collections.OrderedDict

>>> from collections import OrderedDict
>>> from operator import itemgetter
>>> data = {1: 'b', 2: 'a'}
>>> d = OrderedDict(sorted(data.items(), key=itemgetter(1)))
>>> d
OrderedDict([(2, 'a'), (1, 'b')])
>>> d.values()
['a', 'b']
34
jamylak

De votre commentaire à la réponse gnibbler, je dirais que vous voulez une liste de paires clé-valeur triées par valeur:

sorted(data.items(), key=lambda x:x[1])
15
njzk2

Merci pour toutes les réponses . Vous êtes tous mes héros ;-)

A la fin, quelque chose comme ça:

d = sorted(data, key = d.get)

for id in d:
    text = data[id]
7
kingRauk

Trier les valeurs:

sorted(data.values())

résultats

['a','b']
7
eumiro

Je pense aussi qu'il est important de noter que le type d'objet Python dict est une table de hachage ( à ce sujet ici ), et ne peut donc pas être trié sans convertir ses clés/valeurs en listes. Ce que cela permet, c’est dict récupération d’éléments en temps constant O(1), quels que soient la taille/le nombre d’éléments dans un dictionnaire.

Cela dit, une fois que vous triez ses clés - sorted(data.keys()) ou ses valeurs - sorted(data.values()), vous pouvez ensuite utiliser cette liste pour accéder aux clés/valeurs dans des modèles de conception tels que ceux-ci:

for sortedKey in sorted(dictionary):
    print dictionary[sortedKeY] # gives the values sorted by key

for sortedValue in sorted(dictionary.values()):
    print sortedValue # gives the values sorted by value

J'espère que cela t'aides.

4
Morgan Wilde

Dans votre commentaire en réponse à John, vous proposez que vous souhaitiez les clés et les valeurs du dictionnaire, pas seulement les valeurs.

PEP 256 suggère ceci pour le tri d'un dictionnaire par valeurs.

import operator
sorted(d.iteritems(), key=operator.itemgetter(1))

Si vous voulez un ordre décroissant, faites ceci

sorted(d.iteritems(), key=itemgetter(1), reverse=True)
1
Christian Long

pas de méthode lambda

# sort dictionary by value
d = {'a1': 'fsdfds', 'g5': 'aa3432ff', 'ca':'zz23432'}
def getkeybyvalue(d,i):
    for k, v in d.items():
        if v == i:
            return (k)

sortvaluelist = sorted(d.values())
sortresult ={}
for i1 in sortvaluelist:   
    key = getkeybyvalue(d,i1)
    sortresult[key] = i1
print ('=====sort by value=====')
print (sortresult)
print ('=======================')
0
xiyurui

Vous pouvez créer une liste triée à partir de valeurs et reconstruire le dictionnaire:

myDictionary={"two":"2", "one":"1", "five":"5", "1four":"4"}

newDictionary={}

sortedList=sorted(myDictionary.values())

for sortedKey in sortedList:
    for key, value in myDictionary.items():
        if value==sortedKey:
            newDictionary[key]=value

Sortie: newDictionary = {'one': '1', 'two': '2', '1four': '4', 'five': '5'}

0
Marius