2012-12-02 39 views
21

Ich versuche, zwei Listen zu sortieren zusammen:Python Sortierung zwei Listen

list1 = [1, 2, 5, 4, 4, 3, 6] 
list2 = [3, 2, 1, 2, 1, 7, 8] 

list1, list2 = (list(x) for x in zip(*sorted(zip(list1, list2)))) 

Wie auch immer, dies zu tun gibt mir auf Ausgang

list1 = [1, 2, 3, 4, 4, 5, 6] 
list2 = [3, 2, 7, 1, 2, 1, 8] 

während ich möchte die Erstbestellung für gleiche Anzahl halten 4 in der ersten Liste: was ich will ist

list1 = [1, 2, 3, 4, 4, 5, 6] 
list2 = [3, 2, 7, 2, 1, 1, 8] 

Was muss ich tun? Ich möchte keine Schleife für die Blasensortierung verwenden. Jede Hilfe wird geschätzt.

+0

Nicht sicher, was Ihre Anforderung, können Sie genauer sein? –

+3

@ShawnZhang Behalten Sie die ursprüngliche Reihenfolge in list2 für gleiche Elemente in list1 bei. –

+0

[Blasensortierung] (http://en.wikipedia.org/wiki/Bubble_sort) ist ein bestimmter Algorithmus, der Schleifen erfordert. Beachten Sie auch, dass Ihre zweite Ausgabe nicht einer blasensortierten Ausgabe entspricht. –

Antwort

31

Verwenden Sie einen key Parameter für Ihre Sortierung, die nur das erste Element des Paares vergleicht. Da Pythons Sortierung stabil ist, garantiert dies, dass die Reihenfolge der zweiten Elemente gleich bleibt, wenn die ersten Elemente gleich sind.

>>> from operator import itemgetter 
>>> [list(x) for x in zip(*sorted(zip(list1, list2), key=itemgetter(0)))] 
[[1, 2, 3, 4, 4, 5, 6], [3, 2, 7, 2, 1, 1, 8]] 

das entspricht:

>>> [list(x) for x in zip(*sorted(zip(list1, list2), key=lambda pair: pair[0]))] 
[[1, 2, 3, 4, 4, 5, 6], [3, 2, 7, 2, 1, 1, 8]] 
+0

+1. Das ist toll. Vielen Dank für Ihre Rettung. –

4

Der hier Trick ist, dass, wenn Python Vergleiche tut Tupel, es die Elemente, um von links nach rechts vergleicht (zB (4, 1) < (4, 2), was der Grund ist, dass Sie nicht die Bestellung erhalten, die Sie in Ihrem speziellen Fall wünschen). Das bedeutet, dass Sie ein key-Argument an die sorted-Funktion übergeben müssen, die besagt, dass nur das erste Element des Paartupels als Sortierausdruck und nicht das gesamte Tupel verwendet werden soll.

Dies garantiert die Bestellung Sie wollen behalten, weil:

Sorten stabil sein garantiert. Das heißt, wenn mehrere Datensätze denselben Schlüssel haben, bleibt ihre ursprüngliche Reihenfolge erhalten.

(source)

>>> list1 = [1, 2, 5, 4, 4, 3, 6] 
>>> list2 = [3, 2, 1, 2, 1, 7, 8] 
>>> 
>>> list1, list2 = (list(x) for x in zip(*sorted(zip(list1, list2), key=lambda pair: pair[0]))) 
>>> 
>>> print list1 
[1, 2, 3, 4, 4, 5, 6] 
>>> print list2 
[3, 2, 7, 2, 1, 1, 8] 
0

In Sie den Sortiercode wird durchgeführt, auf der ersten und der zweiten Elemente der Tupeln stützen, so dass die sich ergebende zweite Listenelemente sind in der sortierten Reihenfolge für die gleichen Elemente der erste Liste.

auf der zweiten Liste Sortierung zu vermeiden, basiert, geben nur, dass nur die Elemente aus der ersten Liste sollte in dem Vergleich der Tupeln verwendet werden:

>>> from operator import itemgetter 
>>> list1, list2 = (list(x) for x in zip(*sorted(zip(list1, list2),key=itemgetter(0)))) 
>>> list1, list2 
([1, 2, 3, 4, 4, 5, 6], [3, 2, 7, 2, 1, 1, 8]) 

itemgetter(0) von jedem Tupel des ersten Elements führt, die gehört zur ersten Liste.