2010-05-20 6 views
16

J'ai une liste de dictionnaires:Trier une liste des dicts par des valeurs dict

[{'title':'New York Times', 'title_url':'New_York_Times','id':4}, 
{'title':'USA Today','title_url':'USA_Today','id':6}, 
{'title':'Apple News','title_url':'Apple_News','id':2}] 

Je voudrais trier par le titre, donc des éléments à parcourir avant que Z:

[{'title':'Apple News','title_url':'Apple_News','id':2}, 
{'title':'New York Times', 'title_url':'New_York_Times','id':4}, 
{'title':'USA Today','title_url':'USA_Today','id':6}] 

Quelle est la meilleure façon de faire cela? De même, existe-t-il un moyen de s'assurer que l'ordre de chaque clé de dictionnaire reste constant, par exemple toujours title, title_url, puis id?

+0

Puis-je demander pourquoi vous avez besoin un dict trié? Normalement, vous accédez à un dict via les touches de toute façon, donc l'ordre n'a pas d'importance. –

+3

Euh, c'est une liste de dicts Félix. – Amber

+0

@Amber: Ouais je vois ... mais de toute façon sa deuxième question vise à ce;) –

Répondre

2

Appelez .sort(fn) dans la liste, où fn est une fonction qui compare les valeurs de titre et retourne le résultat de la comparaison.

mylist.sort(lambda x,y: cmp(x['title'], y['title'])) 

Dans les versions ultérieures de Python, bien que (2.4+), il est préférable de simplement utiliser une clé de tri:

mylist.sort(key=lambda x:x['title']) 

En outre, les dictionnaires sont garantis pour garder leur ordre, vous étiez à itérer par des clés/valeurs, tant qu'il n'y a plus d'ajouts/suppressions. Si vous ajoutez ou supprimez des objets, cependant, tous les paris sont désactivés, il n'y a aucune garantie pour cela.

-1
originalList.sort(lambda d1, d2: cmp(d1['title'], d2['title'])) 

Bien que cela trie uniquement sur le titre et l'ordre après cela n'est pas défini. Faire plusieurs niveaux serait douloureux de cette façon.

+2

'cmp' est déprécié avec raison comme «clé» est beaucoup mieux. Il est facile de trier sur plusieurs niveaux - il suffit d'utiliser des tuples, voir la réponse de Kenny –

+1

La commande qui suit est définie comme l'ordre dans lequel ils se sont produits à l'origine. (Les tris Python sont stables.) –

17
l.sort(key=lambda x:x['title']) 

Pour trier avec plusieurs clés, en supposant que tout dans l'ordre croissant:

l.sort(key=lambda x:(x['title'], x['title_url'], x['id'])) 
+2

+1, en utilisant 'key' et en tirant l'attribut correct est plus correct/propre que d'utiliser simplement' lambda' comme fonction de tri –

+2

Ouais, je me suis juste souvenu que - Python 2.4+ a eux, ils sont probablement disponibles. – Amber

19

L'alternative hypoallergénique pour ceux qui éternue quand il est approché par lambdas:

import operator 
L.sort(key=operator.itemgetter('title','title_url','id')) 
Questions connexes