2011-01-21 25 views
5

Ciao ho elenco dei dizionari .. e voglio risolvere la case insensitivelista di ordinamento case insensitive utilizzando operator.attrgetter

members = Person.objects.filter(person=person_id) 
members_list = list(members) 

members_list.sort(key = operator.attrgetter(sort_by), reverse = False) 

qui sort_by avere attributo name da chi voglio ordinare. Ora come posso ordinare con maiuscole e minuscole?

Aiutateci ..

risposta

4

Se sort_by è una variabile contenente una stringa con il nome dell'attributo che si desidera utilizzare per l'ordinamento e si desidera utilizzare operator.attrgetter(), si potrebbe usare questo che converte il valore dell'attributo recupera a tutti i caratteri minuscoli per i confronti durante l'ordinamento:

members_list.sort(key = lambda mbr: operator.attrgetter(sort_by)(mbr).lower(), 
        reverse = False) 

anche se qualcosa di simile a ciò che segue è più facile da leggere e più efficienti:

get_key = operator.attrgetter(sort_by) 
members_list.sort(key = lambda mbr: get_key(mbr).lower(), reverse = False) 
+0

thanx signore suo lavoro :) – Ahsan

+0

@Ashan: Prego ... e naturalmente ha funzionato ;-) – martineau

6
members_list.sort(key = lambda member: getattr(member,sort_by).lower(), reverse = False) 
+0

+1 * Questo * è un caso d'uso valida per 'agnello da' (ironicamente, non useresti un lambda per questo in un linguaggio funzionale, dove hai strumenti come il punto '(f.g) (x) = f (g (x))'). Ma hai bisogno di 'getattr (member, sort_by)'. – delnan

+0

sort_by è la mia variabile che ha il nome dell'attributo. – Ahsan

+0

@Ahsan, ok ho frainteso. Ho aggiornato la mia risposta. –

1

Sembra che questa questione è di circa Django. Si potrebbe voler pensare di restituire un queryset ordinato invece. Ciò significa che puoi lasciare l'ordinamento anche al database e non preoccuparti di te stesso. Vedi questo sito: django

+0

hai ragione, ma qui in member_list ho anche alcuni valori chiave degli argomenti, attraverso la relazione inversa. ho anche bisogno di quelli in questa lista. quindi alla query non posso usare order_by. – Ahsan

+0

per questo motivo ho usato sopra il metodo per ordinare la lista. – Ahsan

+0

Spesso può essere più economico ordinare in python piuttosto che nel DB, specialmente per le colonne non indicizzate. –

Problemi correlati