1
votes

Trier un dictionnaire Python 3 par valeurs dans le dictionnaire et non dans une liste de tuples

Je veux trier un dictionnaire par ses valeurs (d'entiers) dans un dictionnaire. Comme suit:

[('e',5),('l':8),('h':10)]

Ce que je veux, c'est:

import operator
sorted_li = sorted(di.items(),key=operator.itemgetter(1),reverse=True)
print(sorted_li)

J'ai beaucoup cherché et j'ai pu le trier dans une liste de tuples, comme:

sorted_di = {'e':5, 'l':8, 'h':10}

Donne:

di = {'h': 10, 'e':5, 'l':8}

Mais je veux que ce soit à nouveau un dictionnaire.

Peut quelqu'un m'aide s'il vous plaît ??


0 commentaires

3 Réponses :


2
votes

Les dictionnaires sont-ils classés en Python 3.6+?

Il s'agit de l'ordre d'insertion . À partir de Python 3.6, pour le CPython implémentation de Python, les dictionnaires mémorisent l'ordre des éléments inséré. Ceci est considéré comme un détail d'implémentation dans Python 3.6; vous devez utiliser OrderedDict si vous voulez que l'ordre d'insertion soit garanti sur d'autres implémentations de Python (et d'autres comportement).

i.e.

  • Pré-3.6:

    >>> dict(sorted_li)
    {'e':5, 'l':8, 'h':10}
    
  • 3.6+:

    >>> from collections import OrderedDict
    ...
    >>> OrderedDict(sorted_li)
    OrderedDict([('e', 5), ('l', 8), ('h', 10)])
    

5 commentaires

Je crois qu'ils l'ont changé d'un détail d'implémentation à une garantie en Python 3.7.


@FightWithCode OrderedDict est un dictionnaire, il ressemble à des tuples uniquement lorsque vous l'imprimez.


D'accord maintenant je comprend. Tout d'abord, triez le dict dans une liste de tuples. Et puis convertissez-le en dict by OrderedDict. Merci beaucoup


@FightWithCode vous devez inclure le code de tri dans le corps de la question; ma réponse visait à décrire la prochaine étape.


D'accord, comme tu veux.



0
votes
di = {'h': 10, 'e':5, 'l':8}
temp_list = []
for key,value in di.items():
    temp_tuple = (k,v)
    temp_list.append(temp_tuple)
temp_list.sort()
for x,y in temp_list:
    dict_sorted = dict(temp_list)
print(dict_sorted)

1 commentaires

Les réponses au code uniquement sont déconseillées sur SO. Veuillez compléter le code que vous avez fourni comme réponse en expliquant pourquoi il résout le problème d'OP.



0
votes

Vous pouvez essayer ceci:

di = {'h': 10, 'e':5, 'l':8}
tuples = [(k, di[k]) for k in sorted(di, key=di.get, reverse=False)]
sorted_di = {}
for i in range(len(di)):
    k = tuples[i][0]
    v = tuples[i][1]
    sorted_di.update({k: v})
print(sorted_di)  # {'e': 5, 'l': 8, 'h': 10}


0 commentaires