web-dev-qa-db-fra.com

Python: Tri du dictionnaire des listes

Toujours apprendre python (enfin!) Et je ne peux pas trop envelopper ma tête autour de celui-ci. Ce que je veux faire est de trier un dictionnaire de listes par valeur à l'aide du troisième élément de la liste. Il est suffisant de trier un dictionnaire en valeur lorsque la valeur est juste un seul numéro ou une chaîne, mais cette liste m'a été déroutée.

Exemple:

myDict = { 'item1' : [ 7, 1, 9], 'item2' : [8, 2, 3], 'item3' : [ 9, 3, 11 ] }

Je veux être capable de parcourir le dictionnaire dans l'ordre de la troisième valeur dans chaque liste, dans ce cas, 9, 3, 11.

Merci beaucoup pour toute aide!

37
jay

Voici une façon de faire cela:

>>> sorted(myDict.items(), key=lambda e: e[1][2])
[('item2', [8, 2, 3]), ('item1', [7, 1, 9]), ('item3', [9, 3, 11])]

Le key argument de la fonction sorted vous permet de déranger une clé de tri de chaque élément de la liste.

Pour itérer sur les clés/valeurs de cette liste, vous pouvez utiliser quelque chose comme:

>>> for key, value in sorted(myDict.items(), key=lambda e: e[1][2]):
...   print key, value
... 
item2 [8, 2, 3]
item1 [7, 1, 9]
item3 [9, 3, 11]
45
Ayman Hourieh

Comme John Machlin a dit que vous ne pouvez pas vraiment trier un Python Dictionary.

Cependant, vous pouvez créer un index des clés qui peuvent être triés dans n'importe quel ordre.

Le fichier préféré Python modèle (IDIOM) pour le tri par tout critère alternatif est appelé "décorer-tri-indexorate" (DSU). Dans cet idiome, vous créez une liste temporaire contenant des utilles de votre clé ( S) suivi de vos éléments de données d'origine, appelez la normale . Trier () Méthode sur cette liste (ou dans des versions plus récentes de =Python enveloppez simplement votre décoration dans une fonction () Fonction intégrée). Ensuite, vous enlevez les "décorations. "

La raison en général est généralement préférée sur la fonction de comparaison de passage au . Trier () La méthode est que le code de tri par défaut intégré de Python (compilé C dans la normale C python) est très rapide et efficace dans le cas par défaut, mais beaucoup, beaucoup plus lentement lorsqu'il doit appeler Python code objet plusieurs fois dans le cas non par défaut. Donc, c'est généralement loin Mieux vaut itérer sur les données Création de structures de données pouvant être transmises aux routines de tri par défaut.

Dans ce cas, vous devriez pouvoir utiliser quelque chose comme:

[y[1] for y in sorted([(myDict[x][2], x) for x in myDict.keys()])]

... c'est une compréhension de liste qui fait l'indécore de la liste triée de tuples qui est renvoyée par la compréhension de la liste intérieure. La compréhension intérieure crée un ensemble de tuples, la clé de tri souhaitée (le 3ème élément de la liste) et la clé du dictionnaire correspondant à la clé de tri. MYDICK.KEYS () est, bien sûr, une méthode de Python dictionnaires qui renvoie une liste de toutes les clés valides dans tout ordre de la mise en œuvre sous-jacente --- probablement une simple itération sur les haubans.

Une manière plus verbeuse de faire cela pourrait être plus facile à lire:

temp = list()
for k, v in myDict.items():
    temp.append((v[2],))
temp.sort()
results = list()
for i in temp:
    results.append(i[1])

Habituellement, vous devez avoir construit ce code itératif, dans l'interprète utilisant des échantillons de petites données. Construisez l'expression ou la fonction de décorer ". Puis enveloppez cela dans un appel à Trié () . Ensuite, construisez l'expression indémonque (qui est généralement aussi simple que ce que j'ai montré ici).

3
Jim Dennis

Tard à la fête et je ne sais pas si c'est ce que vous aviez à l'esprit, mais cela peut être utile à quelqu'un. Si la sortie est censée être une liste:

list_third =[]

for x in my_dic.keys():
    list_third.append(my_dic[x][2])
1
navy