Quelle serait une belle façon d'aller de {2:3, 1:89, 4:5, 3:0}
à {1:89, 2:3, 3:0, 4:5}
?
J'ai vérifié certains articles mais ils utilisent tous l'opérateur "trié" qui retourne les tuples.
python
sorting
dictionary
Antony
la source
la source
Réponses:
Les dictionnaires Python standard ne sont pas classés. Même si vous triiez les paires (clé, valeur), vous ne seriez pas en mesure de les stocker de
dict
manière à préserver l'ordre.La façon la plus simple est d'utiliser
OrderedDict
, qui se souvient de l'ordre dans lequel les éléments ont été insérés:Peu importe que le chemin
od
soit imprimé; cela fonctionnera comme prévu:Python 3
Pour les utilisateurs de Python 3, il faut utiliser le
.items()
au lieu de.iteritems()
:la source
sorted_dict = dict(sorted(unsorted_dict.items()))
Les dictionnaires eux-mêmes n'ont pas d'articles commandés en tant que tels, si vous souhaitez les imprimer, etc. dans un certain ordre, voici quelques exemples:
En Python 2.4 et supérieur:
donne:
(Python inférieur à 2.4 :)
Source: http://www.saltycrane.com/blog/2007/09/how-to-sort-python-dictionary-by-keys/
la source
for key, value in sorted(mydict.items())"
De la
collections
documentation de la bibliothèque de Python :la source
reverse=True
par exempleOrderedDict(sorted(d.items(), reverse=True, key=lambda t: t[0]))
Unexpected type(s): (List[str]) Possible types: (Mapping) (Iterable[Tuple[Any, Any]])
Pour CPython / PyPy 3.6 et tout Python 3.7 ou supérieur, cela se fait facilement avec:
la source
{key:d[key] for key in sorted(d.keys())}
Il existe un certain nombre de modules Python qui fournissent des implémentations de dictionnaire qui maintiennent automatiquement les clés dans l'ordre trié. Considérez le module sortedcontainers qui est des implémentations en Python pur et rapide en C. Il existe également une comparaison des performances avec d'autres options populaires comparées les unes aux autres.
L'utilisation d'un dict ordonné est une solution inadéquate si vous devez constamment ajouter et supprimer des paires clé / valeur tout en effectuant une itération.
Le type SortedDict prend également en charge les recherches et les suppressions d'emplacement indexées, ce qui n'est pas possible avec le type dict intégré.
la source
Simplement:
Production:
la source
sd
est une liste de tuples, pas un dictionnaire. (toujours utile cependant.)Comme d'autres l'ont mentionné, les dictionnaires sont intrinsèquement non ordonnés. Cependant, si le problème affiche simplement les dictionnaires de façon ordonnée, vous pouvez remplacer la
__str__
méthode dans une sous-classe de dictionnaire et utiliser cette classe de dictionnaire plutôt que la fonction intégréedict
. Par exemple.Remarque, cela ne change rien à la façon dont les clés sont stockées, à l'ordre dans lequel elles reviendront lorsque vous les itérerez, etc., à la façon dont elles seront affichées avec
print
ou sur la console python.la source
Trouvé d'une autre manière:
upd:
1. cela trie également les objets imbriqués (merci @DanielF).
2. Les dictionnaires python ne sont pas ordonnés, c'est pourquoi ils ne peuvent être imprimés ou assignés qu'à str.
la source
En Python 3.
donne
la source
Le dictionnaire Python n'était pas ordonné avant Python 3.6. Dans l'implémentation CPython de Python 3.6, le dictionnaire conserve l'ordre d'insertion. À partir de Python 3.7, cela deviendra une fonctionnalité de langage.
Dans le journal des modifications de Python 3.6 ( https://docs.python.org/3.6/whatsnew/3.6.html#whatsnew36-compactdict ):
Dans le document de Python 3.7 ( https://docs.python.org/3.7/tutorial/datastructures.html#dictionaries ):
Contrairement aux versions précédentes, vous pouvez trier un dict après Python 3.6 / 3.7. Si vous souhaitez trier un dict imbriqué comprenant le sous-dict à l'intérieur, vous pouvez faire:
https://gist.github.com/ligyxy/f60f0374defc383aa098d44cfbd318eb
la source
Ici, j'ai trouvé une solution la plus simple pour trier le dict python par clé en utilisant
pprint
. par exemple.mais en utilisant pprint, il renverra dict dicté
la source
Il existe un moyen simple de trier un dictionnaire.
Selon votre question,
La solution est:
(Où c est le nom de votre dictionnaire.)
Ce programme donne la sortie suivante:
comme tu voulais.
Un autre exemple est:
Donne la sortie:
['Albert', 'Bill', 'John', 'Lucy', 'Peter']
Donne la sortie:
[18, 24, 32, 36, 41]
Donne la sortie:
Par conséquent, en le changeant en clés, valeurs et éléments, vous pouvez imprimer comme vous le vouliez.
la source
Générera exactement ce que vous voulez:
Mais ce n'est pas la bonne façon de procéder, car cela pourrait montrer un comportement distinct avec différents dictionnaires, ce que j'ai appris récemment. Par conséquent, la voie parfaite a été suggérée par Tim dans la réponse de ma requête que je partage ici.
la source
Je pense que la chose la plus simple est de trier le dict par clé et d'enregistrer la paire clé: valeur dans un nouveau dict.
Pour plus de clarté:
la source
Vous pouvez créer un nouveau dictionnaire en triant le dictionnaire actuel par clé selon votre question.
Ceci est votre dictionnaire
Créez un nouveau dictionnaire d1 en triant ce d à l'aide de la fonction lambda
d1 doit être {1: 89, 2: 3, 3: 0, 4: 5}, trié en fonction des clés de d.
la source
Les dictés Python ne sont pas ordonnés. Habituellement, ce n'est pas un problème car le cas d'utilisation le plus courant consiste à effectuer une recherche.
La façon la plus simple de faire ce que vous voulez serait de créer une
collections.OrderedDict
insertion des éléments dans l'ordre trié.Si vous avez besoin d'itérer, comme d'autres l'ont suggéré ci-dessus, le moyen le plus simple serait d'itérer sur des clés triées. Exemples-
Imprimer les valeurs triées par clés:
Obtenez la liste des valeurs triées par clés:
la source
for k,value in sorted(d.items()):
c'est mieux: évite d'accéder à nouveau au dict par clé dans la boucleJe propose un tri de dict sur une seule ligne.
J'espère que cela vous sera utile.
la source
Cette fonction triera récursivement tout dictionnaire par sa clé. Autrement dit, si une valeur du dictionnaire est également un dictionnaire, elle sera également triée par sa clé. Si vous utilisez CPython 3.6 ou supérieur, une simple modification pour utiliser un
dict
plutôt qu'unOrderedDict
peut être effectuée.la source
Les gars, vous compliquez les choses ... c'est vraiment simple
La sortie est:
la source
La solution la plus simple consiste à obtenir une liste des clés de dict dans l'ordre trié, puis à répéter sur dict. Par exemple
Voici la sortie (ordre décroissant)
la source
Un moyen simple de le faire:
la source
Une comparaison temporelle des deux méthodes en 2.7 montre qu'elles sont pratiquement identiques:
la source
la source
la source
Ou utilisez
pandas
,Démo:
Voir:
la source
Ma suggestion est la suivante car elle vous permet de trier un dict ou de garder un dict trié pendant que vous ajoutez des éléments et devrez peut-être ajouter des éléments à l'avenir:
Construisez un à
dict
partir de zéro au fur et à mesure. Ayez une deuxième structure de données, une liste, avec votre liste de clés. Le paquetage bisect a une fonction d'insort qui permet d'insérer dans une liste triée, ou de trier votre liste après avoir complètement rempli votre dict. Maintenant, lorsque vous parcourez votre dict, vous parcourez plutôt la liste pour accéder à chaque clé de manière ordonnée sans vous soucier de la représentation de la structure du dict (qui n'a pas été conçue pour le tri).la source
Pour la façon dont la question est formulée, la plupart des réponses ici y répondent correctement.
Cependant, compte tenu de la façon dont les choses devraient être vraiment faites, en tenant compte de décennies et de décennies d'informatique, je suis totalement surpris qu'il n'y ait en fait qu'une seule réponse ici (de l' utilisateur GrantJ ) suggérant l'utilisation de conteneurs associatifs triés (conteneurs triés) qui trie les éléments en fonction de la clé à leur point d'insertion.
Cela évitera énorme impact sur les performances pour chaque appel de
sort(...)
(au minimumO(N*log(N))
, oùN
est en nombre d'éléments (logiquement, cela vaut pour toutes les solutions ici qui suggèrent d'utiliser lesort(...)
). Prenez à compte que pour toutes ces solutions, l'sort(...)
devront être appelé à chaque fois que la colletion doit être consultée comme triée APRÈS avoir été modifiée en ajoutant / supprimant des éléments ...la source
la source