Sortiere eine Teilmenge einer Python-Liste so, dass sie dieselbe relative Reihenfolge wie in anderen Listen hat

8

Also eine Liste sagen b = [b1, b2, b3] Ich möchte in der Lage sein, eine Liste a so zu sortieren, dass alle bi , die auch in a existieren, die gleiche relative Reihenfolge wie in% co_de haben % - den Rest von b 's Elementen allein lassen. Also

%Vor%

b kann natürlich ein Tupel oder eine andere geordnete Struktur sein. Was ich herausgefunden habe

%Vor%

ist ungeschickt und O (n ^ 2)

    
Mr_and_Mrs_D 28.05.2015, 10:44
quelle

2 Antworten

6
  • Erstellen Sie zuerst ein Dictionary mit Elementen aus b , wobei der Schlüssel das Element und der Wert sein Index ist. Damit sortieren wir später die übereinstimmenden Elemente in a .

  • Filtern Sie nun das Objekt aus a , das in diesem dict vorhanden ist, dict liefert O (1) lookup.

  • Sortieren Sie nun diese Liste gefilterter Elemente und konvertieren Sie sie in einen Iterator.

  • Wiederholen Sie die Schleife erneut mit a und überprüfen Sie für jedes Element, ob es in dict vorhanden ist, und rufen Sie dann seinen Wert vom Iterator ab. Andernfalls verwenden Sie es wie es ist.

%Vor%

Die Gesamtkomplexität der Zeit wird maximal von (O(len(a)), O(len(b)), O(items_in_a_length log items_in_a_length) sein.

    
Ashwini Chaudhary 28.05.2015, 10:57
quelle
0

Die angenommene Antwort beantwortet die gestellte Frage, aber mein tatsächliches Problem war ein wenig restriktiver - ich möchte die Artikel in den gleichen relativen Positionen in a so viel wie möglich behalten. Also die angenommene Antwort (und mein ursprünglicher Versuch) würde:

%Vor%

Ich möchte einfach die Out-of-Order-Items "aufblasen", damit sie möglichst wenige ihrer Vorfahren verlieren: [ A, B, C, D, E, Z ] -> [ A, C, D, E, B, Z ] . Beachten Sie, dass E bisher die Vorfahren C und D verlieren würde, während B jetzt nur noch B verliert. Abgeprüft:

%Vor%     
Mr_and_Mrs_D 13.05.2016 16:43
quelle