2 votes

Comment trier un dict avec l'ordre d'une liste en python ?

Par exemple a est un dict, a = {1:2,2:3,3:4} et b= [3,1]

Je veux trier a pour obtenir une liste de tuple qui si les clés dans a est en b et les trier dans l'ordre suivant b sinon, les mettre à la fin de la liste de tuple.

Je le fais comme ceci :

sorted(a.items(), key = lambda (k, v): b.index(k) if k in b else a.keys().index(k))

mais, je pense que c'est mal.

Je peux donc le faire en utilisant Python.

Gracias

4voto

mbatchkarov Points 5090

Essayez ça :

import sys
sorted(a.items(), key = lambda (k, v): b.index(k) if k in b else sys.maxint)

Pour les clés qui ne sont pas dans b nous retournons une valeur très grande, ce qui les place à la fin du résultat trié.

2voto

gnibbler Points 103484

Une bonne façon de gérer les cas particuliers est d'utiliser les tuples comme clé de tri.

>>> a = {1: 2, 2: 3, 3: 4}
>>> b= [3, 1]
>>> sorted(a.items(), key=lambda (k,v):(0, b.index(k)) if k in b else (1,))
[(3, 4), (1, 2), (2, 3)]

si b est long, c'est une bonne idée de créer un dict pour accélérer les recherches dans l'index.

>>> b_dict = {k:v for v, k in enumerate(b)}
>>> sorted(a.items(), key=lambda (k,v):(k not in b_dict, b_dict.get(k)))
[(3, 4), (1, 2), (2, 3)]

0voto

Daniel Frey Points 30752

Je ne suis pas sûr du résultat attendu que vous voulez, mais peut-être que cela vous aidera :

a = {1:2,2:3,3:4}
b = [3,1]

r = [(x,a[x]) for x in b if x in a]

ce qui donne r comme une liste :

[(3, 4), (1, 2)]

Si ce n'est pas le résultat attendu, cela peut être utile comme étape intermédiaire.

0voto

martineau Points 21665

Je pense que cela fait ce que vous voulez :

a = {1:2,2:3,3:4}
b = [3,1]

print ([(k,a[k]) for k in b if k in a] +
       [(k,a[k]) for k in a if k not in b])

Sortie :

[(3, 4), (1, 2), (2, 3)]

Cela pourrait également fonctionner :

head, tail = [], []
any((head if k in b else tail).append((k,a[k]))
    for k in (b + [k2 for k2 in a if k2 not in b]))
print head+tail

Je n'appellerais pas ça trier a -- peut-être en le commandant.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X