2016-04-09 16 views
5

vorrei ordinare un elenco in Python sulla base di un elenco preordinateOrdinamento di un elenco in Python basato su un altro elenco ordinato

presorted_list = ['2C','3C','4C','2D','3D','4D'] 
unsorted_list = ['3D','2C','4D','2D'] 

C'è un modo per ordinare l'elenco in modo da riflettere la lista preordinate, nonostante il fatto che non tutti gli elementi siano presenti nella lista non ordinata?

voglio il risultato simile a questo:

after_sort = ['2C','2D','3D','4D'] 

Grazie!

risposta

7
In [5]: sorted(unsorted_list, key=presorted_list.index) 
Out[5]: ['2C', '2D', '3D', '4D'] 

o, per migliorare le prestazioni (in particolare quando len(presorted_list) è grande),

In [6]: order = {item:i for i, item in enumerate(presorted_list)}  
In [7]: sorted(unsorted_list, key=order.__getitem__) 
Out[7]: ['2C', '2D', '3D', '4D'] 

Per ulteriori informazioni su come ordinare utilizzando key s, vedere l'eccellente Howto Sort wiki.


Se unsorted_list contiene articoli (come '6D') non presorted_list allora i metodi di cui sopra genera un errore. Devi prima decidere come vuoi ordinare questi elementi. Se li volete posti alla fine della lista, è possibile utilizzare

In [10]: unsorted_list = ['3D','2C','6D','4D','2D'] 

In [11]: sorted(unsorted_list, key=lambda x: order.get(x, float('inf'))) 
Out[11]: ['2C', '2D', '3D', '4D', '6D'] 

o se si desidera inserire tali elementi nella parte anteriore della lista, utilizzare

In [12]: sorted(unsorted_list, key=lambda x: order.get(x, -1)) 
Out[12]: ['6D', '2C', '2D', '3D', '4D'] 
+0

Mi dispiace, ho Sono nuovo a questo, ma il primo bit di codice sembra darmi un errore di valore per il primissimo elemento nella lista non ordinata. ValoreErrore: '6D' non è nell'elenco –

+0

'.index' genererà un errore di valore se l'elemento non è nell'elenco presorted. –

+0

@Danica: Se vuoi elementi _removed_ che non sono in 'presorted_list', usa qualcosa come' sorted (itertools.ifilter (lambda x: x in presorted_list, unsorted_list), key = order .__ getitem __) '. – martineau

Problemi correlati