2016-04-09 17 views
5

Ich mag würde eine Liste in Python sortieren basierend auf einer vorsortierten ListeSortieren eine Liste in Python basierend auf einer anderen sortierten Liste

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

Gibt es einen Weg, um die Liste zu sortieren die vorsortierte Liste zu reflektieren trotz die Tatsache, dass nicht alle Elemente in der unsortierten Liste vorhanden sind?

Ich möchte das Ergebnis in etwa so aussehen:

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

Dank!

Antwort

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

oder, für eine bessere Leistung (vor allem, wenn len(presorted_list) groß ist),

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'] 

Für mehr auf, wie key s sortieren verwenden, die ausgezeichnete Howto Sort wiki sehen.


Wenn unsorted_list enthält Elemente (wie '6D') nicht in presorted_list dann die obigen Verfahren wird einen Fehler erhöhen. Sie müssen zuerst entscheiden, wie Sie diese Artikel sortieren möchten. Wenn Sie sie am Ende der Liste gesetzt möchten, können Sie

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'] 

verwenden oder wenn Sie solche Elemente an der Vorderseite der Liste platzieren möchten, verwenden Sie

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

Es tut mir leid, ich bin neu, aber das erste Bit des Codes scheint mir einen Wert Fehler für das allererste Element in der unsortierten Liste zu geben. ValueError: '6D' ist nicht in der Liste –

+0

'.index' wird einen Wert Fehler auslösen, wenn das Element nicht in der Vorsortierte_liste ist. –

+0

@Danica: Wenn Sie Elemente _removed_ wollen, die nicht in der 'vorsortierten_liste' sind, verwenden Sie etwas wie' sorted (itertools.ifilter (lambda x: x in vorsortierte_liste, unsortierte_liste), key = order .__ getitem __) '. – martineau

Verwandte Themen