2010-01-08 4 views
3

Je suis nouveau à Python et je suis curieux si je le fais correctement. J'ai un tuple de dicts (d'un appel de base de données):Tri d'un tuple de dicts

companies = ({ 'companyid': 1, 'companyname': 'Company C' }, 
       { 'companyid': 2, 'companyname': 'Company A' }, 
       { 'companyid': 3, 'companyname': 'Company B' }) 

Je veux trier ceci sur le nom de compagnie. Y a-t-il un moyen plus correct que cela de le faire?

sortcompanies = list(companies) 
sortcompanies.sort(lambda x,y: cmp(x['companyname'],y['companyname'])) 

Merci pour votre critique!

+0

S'il est possible que 2 sociétés aient le même nom, vous pouvez potentiellement avoir différentes commandes finales en fonction de la commande initiale. Je ne sais pas si cela compte dans votre application. –

+0

Bon point, cela ne devrait jamais arriver dans mon application, mais c'est quelque chose que je vais garder à l'esprit. – Wes

Répondre

7

Vous pouvez faire quelque chose comme:

import operator 
... 
sortcompanies.sort(key=operator.itemgetter("companyname")) 

Je pense que c'est une question de goût.

EDIT j'ai eu companyid au lieu de companyname. Corrigé cette erreur.

+0

J'aime mieux ça que ce que je faisais. Merci! – Wes

2

C'est très bien, mais vous voudrez peut-être envisager sorting by keys:

sortcompanies.sort(key=lambda x:x['companyname']) 

à la place. C'est un peu plus facile à lire, et il y aura moins d'appels à x['companyname']. @extraneon fait un bon point sur l'utilisation operator.itemgetter comme clé. C'est assez lisible aussi.

3
>>> companies = ({ 'companyid': 1, 'companyname': 'Company C' }, 
       { 'companyid': 2, 'companyname': 'Company A' }, 
       { 'companyid': 3, 'companyname': 'Company B' }) 

>>> sorted(companies, key=lambda x: x['companyname']) 
[{'companyname': 'Company A', 'companyid': 2}, {'companyname': 'Company B', 'companyid': 3}, {'companyname': 'Company C', 'companyid': 1}] 

comme vous le verrez en lisant le premier argument docs of sorted à l'sorted pourrait être une itératives, de sorte que vous pourriez même pas besoin de créer le tuple.