2010-03-10 3 views
2
def sortProfiles(p): 
    return sorted(p, key=itemgetter('first_name')) 

J'ai une liste avec les dictionnaires. Cette fonction me permet de les trier par leur prénom. Cependant, il est sensible à la casse.Comment rendre ce casse de tri insensible?

+0

Les quatre réponses en majuscules à cette question sont toutes identiques: D – dimo414

Répondre

7
>>> from operator import itemgetter 
>>> p = [{'fn':'bill'}, {'fn':'Bob'}, {'fn':'bobby'}] 
>>> sorted(p, key=itemgetter('fn')) 
[{'fn': 'Bob'}, {'fn': 'bill'}, {'fn': 'bobby'}] 
>>> sorted(p, key=lambda x: x['fn'].lower()) 
[{'fn': 'bill'}, {'fn': 'Bob'}, {'fn': 'bobby'}] 
>>> 
2

Voici une manière:

return sorted(p, key=lambda x: x['first_name'].lower()) 
1

On dirait que vous voulez sorted(p, key=lambda d: d['first_name'].lower()).

1
>>> def my_itemgetter(attr): 
     def get_attr(obj): 
      return obj.get(attr, "").lower() 
     return get_attr 

>>> a= [{"a":"dA"},{"a":"ab"},{"a":"Ac"},{"a":"aa"}] 
>>> sorted(a, key=my_itemgetter("a")) 
[{'a': 'aa'}, {'a': 'ab'}, {'a': 'Ac'}, {'a': 'dA'}] 
+0

Cela surcomplique la solution. En outre, 'my_itemgetter' devrait être mieux nommé. –

+0

soin de corriger votre indentation? –

+0

@Mike: il ne devrait pas copier n'importe quel extrait de n'importe quel site. Ceci est destiné à lui de comprendre ce qui est nécessaire, tout en fournissant une solution générique. Il peut le nommer comme il veut. En n'utilisant pas lambda, il peut alors rendre le 'itemgetter' aussi complexe (custom?) Qu'il le souhaite. – voyager

1
def sortProfiles(p): 
    return sorted(p, key=lambda el: el['first_name'].lower()) 
1

Si vous n'aimez pas lambda, vous pouvez utiliser une fonction nommée comme clé extracteur, par exemple:

def sortProfiles(p): 
    def lowerName(d): 
     return d['first_name'].lower() 
    return sorted(p, key=lowerName) 

La déclaration def peut apparaître à peu près partout une autre déclaration pourrait, y compris dans le corps d'une autre fonction. Dans ce cas, le choix entre un def imbriqué, un lambda, ou un def séparé en dehors de sortProfiles, est principalement une question de style, bien que le dernier d'entre eux pourrait offrir un gain de performance.

+0

Aimez-vous lambda? – TIMEX

+1

@alex, oui, je ne l'aime pas, bien que je l'utilise parfois pour des cas particulièrement simples. 'def' est supérieur pour le profilage, le débogage, la facilité d'insertion des appels 'logging', la clarté des retraçages, et la généralité (permet l'utilisation des instructions, pas seulement les expressions) -' lambda' n'a pas d'avantages concrets compensatoires de devoir penser à un nom ;-). –

Questions connexes