9
votes

Python: Comment commande personnalisée une liste?

Obs: Je sais que les listes de python ne sont pas fixées par ordre, mais pensez que celui-ci sera. Et j'utilise Python 2.4

J'ai une liste, comme (par exemple) celui-ci: p> xxx pré>

Cette variable myList est obtenue à partir d'une fonction, et le " L'ordre de la liste renvoyée variera. Donc, parfois ce sera comme sur l'exemple. Parfois, le "rapport" viendra avant "article", etc. p>

J'ai un ordre fixe que je veux sur cette liste (et n'est pas l'alphabétique). P>

Dis que mon ordre fixe est: "Signaler", "Article", "Livre", ... P>

Alors, ce que je veux, c'est que: Quel que soit l'ordre "MyList 'est instancié, je veux la réorganiser Rendre "rapport" rester à l'avant, "article" sur deuxième, etc ... p>

Quelle est la meilleure approche pour réorganiser ma liste (prenant le premier élément du tuple de chaque élément sur la liste) en utilisant mon " Personnalisé 'ordre? P>

réponse strong>: P>

J'ai fini avec ceci: P>

MyList est devenu une liste de dicttes, Comme ceci: p> xxx pré>

chaque dict ayant un "ID" qui devait être trié. P>

Enregistrement de l'ordre correct sur un fichier LisasSIGNAGE Le correct_order sur une liste: p> xxx pré>

et faire: p>

results = sorted([item for item in results], cmp=lambda x,y:cmp(correct_order.index(x['id']), correct_order.index(y['id'])))


0 commentaires

5 Réponses :


6
votes

Vous pouvez utiliser un dictionnaire qui vous permettrait d'accéder au "livre", de "article", etc. sans avoir à se soucier de la commande. Je mettrais les données de cette liste dans un dict qui ressemblait à ceci: xxx

Si vous souhaitez vraiment trier votre liste de la manière dont vous avez décrite, vous pouvez utiliser la liste . Trier avec une fonction de clé qui représente votre ordre de tri particulier ( Documentation ). Vous avez besoin de la fonction clé comme vous devez accéder uniquement au premier élément et votre ordre de tri n'est pas également alphabétique.


1 commentaires

wiki.python.org/moin/howto/sorting à nouveau, ce lien est la Très utile dans cette question!



19
votes

Vous pouvez utiliser un dictionnaire qui ferait mapper chaque premier élément à son "poids" puis vérifier ce dictionnaire à l'intérieur d'une fonction de tri.

quelque chose comme: p>

d = { "Report": 1,
      "Article": 2,
       "Book": 3 }
result = sorted(mylist, key=lambda x:d[x[0]])


4 commentaires

Mieux vaut utiliser une fonction clé plutôt que la fonction CMP obsolète qui ne quitte plus dans Python 3: Trié (myList, clé = lambda x: D [x [0]])


N'essayez pas encore Python 3, alors je ne savais pas .. merci :)


Il est également recommandé pour Python 2 comme en utilisant une fonction clé est plus rapide qu'une fonction CMP. Voir docs.python.org/library/fonctions.html#sorted


Vous pouvez également utiliser l'écrire comme ceci: d = ["rapport", "article", "book"] , puis résultat = trié (myList, clé = lambda x: d.index (x [0])



2
votes

De cette façon crée un dict et tire les éléments de celui-ci dans l'ordre xxx

de cette façon utilise trier avec O (1) recherches pour la commande xxx


0 commentaires

1
votes

Plus généralement, il pourrait y avoir des éléments de la mychiste qui ne sont pas dans l'ordre fixe spécifié. Cela commande selon la règle, mais laissez seul l'ordre relatif de tout en dehors de la règle: xxx


0 commentaires

0
votes

Cette fonction trie dans une liste personnalisée, mais si un élément n'est pas dans la liste, une erreur ne sera pas générée. Cependant, cet élément sera à la fin de la ligne.

custom_order = ('fa','a','b','c','d','e')
my_list =  ('e','c','fa','h','h','g')

result = sort_custom(custom_order,my_list)
print(result)


0 commentaires