2010-05-26 5 views
1

Dans Django, j'ai un objet modèle dans une liste.Comment trier une liste d'objets Django python?

[object, object, object] 

Chaque objet a ".name" qui est le titre de la chose.

Comment trier par ordre alphabétique selon ce titre?

Cela ne fonctionne pas:

catlist.sort(key=lambda x.name: x.name.lower()) 
+0

Il serait utile que vous lisez les messages d'erreur, celui de vos points de code ** exactement sur le point ** dans 'x.name' – Marian

Répondre

3
catlist.sort(key=lambda x: x.name.lower()) 
1

Sans l'appel à lower(), ce qui suit pourrait être considéré comme un peu plus propre que d'utiliser un lambda:

import operator 
catlist.sort(key=operator.attrgetter('name')) 

Ajouter cet appel à lower() et vous entrez dans un monde de douleur de composition de fonction. Utilisation trouvé l » compose()Ants Aasma dans une réponse à this other SO question, vous pouvez aussi voir la lumière qui est la programmation fonctionnelle (je déconne Tous les paradigmes de programmation ont sûrement leur temps et lieu..):

>>> def compose(inner_func, *outer_funcs): 
...  if not outer_funcs: 
...   return inner_func 
...  outer_func = compose(*outer_funcs) 
...  return lambda *args, **kwargs: outer_func(inner_func(*args, **kwargs)) 
... 
>>> class A(object): 
... def __init__(self, name): 
...  self.name = name 
... 
>>> L = [A(i) for i in ['aa','a','AA','A']] 
>>> name_lowered = compose(operator.attrgetter('name'), 
          operator.methodcaller('lower')) 
>>> print [i.name for i in sorted(L, key=name_lowered)] 
['a', 'A', 'aa', 'AA']