2012-11-16 20 views
9
order = ['w','x','a','z'] 
[(object,'a'),(object,'x'),(object,'z'),(object,'a'),(object,'w')] 

Come si ordina l'elenco di tuple di cui sopra per il secondo elemento in base all'elenco di chiavi fornito da "ordine"?elenco di ordinamento di tuple con chiave arbitraria

UPDATE 11/18/13:

ho trovato un metodo molto migliore per una variante di questa domanda dove le chiavi sono certi di essere unico, dettagliato in questa domanda: Python: using a dict to speed sorting of a list of tuples.

La mia domanda di cui sopra non si applica in quanto l'elenco di tuple contiene due tuple con il valore chiave di 'a'.

+0

Puoi dare un esempio di come ti aspetti che il risultato sia simile? – enginefree

risposta

11

È possibile utilizzare sorted e fornire come key una funzione che restituisce l'indice del secondo valore di ogni tupla nell'elenco order.

>>> sorted(mylist,key=lambda x: order.index(x[1])) 

[('object', 'w'), ('object', 'x'), ('object', 'a'), ('object', 'a'), ('object', 'z')] 

Attenzione, questo fallisce quando il valore dai tuple non è presente nella lista order.

Edit:

Al fine di essere un po 'più sicuro, è possibile utilizzare:

sorted(mylist,key=lambda x: x[1] in order and order.index(x[1]) or len(order)+1) 

Questo metterà tutte le voci con una chiave che manca da order lista alla fine del la lista risultante.

+0

Quest'ultima modifica è stata molto utile perché ora posso lasciare che l'ordinamento abbia esito negativo in un modo molto elegante. Grazie! – Cole

Problemi correlati