2017-07-21 3 views
0

Ich habe zwei Listen, wo ich die erste in Bezug auf die zweite sortieren möchte. Zum Beispiel hier habe ich die beidenSortierung Liste der Liste w.r.t eine andere Liste der Listen in Python

old = [[1, 7, 3, 2, 5, 4, 6, 0, 8, 9], 
     [7, 3, 2, 5, 4, 6, 1, 8, 0, 9], 
     [9, 2, 8, 7, 1, 5, 0, 4, 6, 3]] 
new = [[4, 1, 5, 6, 7, 9, 10, 11, 8, 2, 3, 0], 
     [10, 6, 4, 3, 0, 11, 2, 5, 8, 1, 9, 7], 
     [0, 1, 7, 10, 9, 6, 4, 5, 8, 2, 3, 11]] 

ich die new Liste der Liste w.r.t der old Liste der Liste sortieren möchten. so für die neue sollte die Einträge

sorted_new = [[1, 7, 3, 2, 5, 4, 6, 0, 8, 9, 10, 11], 
       [7, 3, 2, 5, 4, 6, 1, 8, 0, 9, 10, 11], 
       [9, 2, 8, 7, 1, 5, 0, 4, 6, 3, 10, 11]] 
werden

Wichtig zu beachten ist, dass beide Listen, die übereinstimmen sollen, nicht von gleicher Größe sind. Wie kann ich das erreichen?

+0

Aber es ist mir nicht wirklich klar, was du mit "in Bezug auf eine andere Liste" meinst. Zumal die Listen nicht gleich groß sind. Können Sie erklären, wie die Eingabe auf die Ausgabe abgebildet wird? –

+0

Basierend auf Ihrem Beispiel sortieren Sie die Liste nicht, Sie fügen einfach die Liste 'new' mit Elementen von' alt' an, die noch nicht in der Liste waren. –

+0

Für mich ist diese Frage völlig unklar. Es scheint, dass das "sortierte neue" überhaupt nicht sortiert ist? –

Antwort

2

können Sie den folgenden Ansatz verwenden:

sorted_new = [] 
for sub_new,sub_old in zip(new,old): 
    old_idx = {k:v for v,k in enumerate(sub_old)} 
    sorted_new.append(sorted(sub_new,key=lambda x:old_idx.get(x,len(sub_old)))) 

Dies erzeugt dann:

>>> sorted_new 
[[1, 7, 3, 2, 5, 4, 6, 0, 8, 9, 10, 11], [7, 3, 2, 5, 4, 6, 1, 8, 0, 9, 10, 11], [9, 2, 8, 7, 1, 5, 0, 4, 6, 3, 10, 11]] 

Der Code wie folgt funktioniert: wir zunächst über die beiden Listen laufen gleichzeitig new und old. Für jedes solche Paar von Listen. Wir erzeugen zuerst ein Wörterbuch mit Wörterbuchverständnis, das die Elemente der sub_old zu ihren entsprechenden Indizes in der Liste abbildet. Als nächstes erstellen wir eine sortierte Liste für sub_new. Wenn das Element dieser sub_new in der old_idx ist, geben wir den Index zurück (und dies ist somit der Sortierschlüssel). Wenn nicht, geben wir einen Standardwert len(sub_old) zurück, der somit größer ist als alle Indizes im Wörterbuch. Als Ergebnis wird dieses Element auf der rechten Seite der Liste platziert.

Da Pythons Sortierfunktion garantiert stabil ist, bedeutet das, dass die Elemente, die nicht in old waren, die ursprüngliche Reihenfolge beibehalten werden.

Wir hätten etwas Magie um die list.index(..) Methode verwendet, anstatt solch ein Indexwörterbuch zu konstruieren. Aber das Problem mit .index(..) ist, dass es in O (n) läuft. So würde dies den Algorithmus O (m × n log n) für jeden sublist machen, mit m die Anzahl der Elemente in old und n die Anzahl der Elemente in new.

+0

Genau das, was ich machen wollte. Danke vielmals :) –