2011-01-10 1 views
4

J'ai la liste suivante:Quelle est la manière Pythonienne de réorganiser une liste composée de dictionnaires?

list = [{'nr' : 2, 'name': 'streamname'}, {'nr' : 3,'name': 'streamname'}, {'nr' : 1, 'name': 'streamname'}] 

Alors, comment aurais-je modifier l'ordre de devenir comme celui-ci d'une manière efficace en python? Je suis venu avec l'aide de tri et la création d'une fonction lambda pour le trier. Est-ce un bon moyen? Et est-ce efficace?

list.sort(cmp=lambda x,y: cmp(x['nr'], y['nr'])) 
+0

Cela me semble bon. – neil

Répondre

12

Non, l'utilisation de cmp= n'est pas efficace. Utilisez key= à la place. Comme si:

sorted(list, key=lambda x: x['nr']) 

La raison est simple: cmp compare deux objets. Si votre liste est longue, il existe de nombreuses combinaisons de deux objets que vous pouvez comparer, donc une liste deux fois plus longue prend plus de deux fois plus de temps à trier.

Mais avec key ce n'est pas le cas et le tri des longues listes sont donc beaucoup plus vite.

Mais la principale raison d'utiliser key au lieu de cmp est qu'il est beaucoup plus facile à utiliser.

En outre, sorted() a un avantage sur .sort(), il peut prendre tout itérable, tandis que .sort() fonctionne inly sur les listes.

+0

Yea cherchait là-dedans, mais ça n'a pas fonctionné quand j'ai utilisé key = x ['nr'] peu stupide que je n'ai pas fait de fonction lambda pour ça aussi ... Ça marche super! Je suppose que je peux accepter votre réponse bientôt, mais je la garderai ouverte quelques heures. –

+4

Vous pouvez également utiliser 'itemgetter' depuis le module' operator' au lieu de devoir écrire votre propre fonction lambda et ce serait aussi plus rapide. – milkypostman

+0

Je ne comprends pas. Le fonctionnement de base de l'algorithme _every_ sort est la comparaison de deux éléments. Je ne vois pas comment utiliser 'key' au lieu de' cmp' fait la différence. Pourriez-vous élaborer? –

3
mylist.sort(key=operator.itemgetter('nr')) 
Questions connexes