J'ai dict dans Python avec des touches du formulaire suivant: Certains des indices n'ont aucune sous-valeur, certains ont un niveau de sous-valeurs et certains ont deux. Si j'avais seulement un sous-niveau, je pourrais les traiter tout comme des chiffres et trier numériquement. Le deuxième sous-niveau me force à les gérer tous comme des cordes. Cependant, si je les trite comme des chaînes, j'aurai Comment puis-je régler correctement les indices? p> Note: Strong> Ce que je veux vraiment faire est d'imprimer la dicte triée par index. S'il y a une meilleure façon de le faire que de le trier d'une manière ou d'une autre, c'est bien avec moi. P> P> 10 code> suivant 1 code> et 20 code> suivant 2 code>. p>
6 Réponses :
Vous pouvez trier les clés de la façon dont vous voulez, en les divisant sur '.' ' puis convertir chacun des composants en un entier, comme celui-ci: qui retourne ceci: p> Vous pouvez itérer sur cette liste des clés et tirez les valeurs hors de votre dictionnaire si nécessaire. p> Vous pouvez également trier le résultat de MyDICT.ITEMS (), très similaire: P> [('0', 10),
('1', 23),
('2.0', 321),
('2.1', 3231),
('3', 3),
# ...
('12.1.1', 2)]
Et bien sûr, vous n'avez pas besoin d'utiliser une Lambda, vous pouvez définir une fonction habituelle et passer dans le nom.
Plus rapide que la version comparateur (moins de conversions / appels de fonction).
Mise à jour de la syntaxe pour Python 3: Trié (mydic.items (), Key = Lambda A: [* Carte (int, A [0] .split ('.'))]) Code>
Les fonctions de tri de Python peuvent prendre une fonction de comparaison personnalisée, vous devez donc simplement définir une fonction qui compare les touches de votre choix: dans ce cas, vous devriez mieux utiliser le < Code> Clé Code> Paramètre sur Trié () CODE>, cependant. Voir Réponse de Ian Clelland pour un exemple pour cela. p> p>
Il est préférable de fournir la fonction clé comme Ian le fait. La fonction de clé est appelée une fois pour chaque élément, la fonction CMP est appelée chaque fois que le tri fait une comparaison.
@gnibbler: Oui, j'ai compris qu'après la réponse de Ian, je pensais à supprimer ma réponse, mais je suppose que cela pourrait être utile pour quelqu'un qui a besoin d'un comparateur plus compliqué qui ne peut pas être fait en passant un simple clé code>.
Je ferais une recherche sur "Tri du dictionnaire Python" et jetez un oeil à les réponses. Je donnerais PEP-265 une lecture aussi. Trié () Code> fonction est ce que vous recherchez. p>
comme un addendum à
Pour le plaisir et l'utilité (pour Googling PPL, principalement): Utilisez comme IT Peut-être pas très efficace, mais même avec cela, c'est assez utile. p> et, UHM, il peut être utilisé comme clé = pour trier () aussi. P> P> trié (liste, CMP = CMPG) code>.
De plus, les expulsions pourraient être pré-compilées (rarement nécessaires cependant, en réalité, avec la mise en cache de ré-module).
Et, il peut être (facilement) modifié, par exemple, d'inclure des valeurs négatives (Ajouter -? Code> à num regex, probablement) et / ou pour utiliser des valeurs de flotteur. P>
Il y a un bon tri HOWTO sur le site Web Python: http: //wiki.python. Org / MOIN / HOWTO / Tri . Il fait une bonne introduction au tri et discute de différentes techniques pour adapter le résultat de tri à vos besoins. P>
Ceci s'appelle "tri naturel". Voir Stackoverflow.com/Questtions/34518/Natural-Sorting-algorithm