2010-02-16 11 views
27

Angenommen, wir haben eine Liste:Sortieren ein Teil einer Liste anstelle

a = [4, 8, 1, 7, 3, 0, 5, 2, 6, 9] 

Nun a.sort() die Liste an Ort und Stelle sortieren. Was, wenn wir nur einen Teil der Liste sortieren möchten, noch an Ort und Stelle? In C++ könnten wir schreiben:

int array = { 4, 8, 1, 7, 3, 0, 5, 2, 6, 9 }; 
int * ptr = array; 
std::sort(ptr + 1, ptr + 4); 

Gibt es einen ähnlichen Weg in Python?

+0

Warum muss nur an Ort und Stelle sortiert werden? –

+0

Ich denke, dass es eine gute Sache wäre, eine Anfrage an Python zu stellen. Es wären nur optionale Argumente für Anfang und Ende der Standardmethode sort(). –

+0

Ein guter Grund für In-Place-Sortierung ist ein Fall, in dem Sie das Ende der Liste sortieren möchten (das ist meist schon sortiert, vielleicht durch eine weniger teure Schlüsselfunktion), und dann den letzten Wert ausgeben. Bei der Konstruktion einer meist gierigen TSP-Lösung kam es zu diesem Anwendungsfall. Wird wahrscheinlich mit der Lösung von @fviktor gehen. – Jostikas

Antwort

0

könnten Eine pythonic Lösung sein:

# i,j = range to sort. 
a = a[:i] + sorted(a[i:j]) + a[j:] 

Dies wird als ‚an Ort und Stelle‘ nicht sortiert, aber das scheint wie eine künstliche Anforderung. Freut mich zu hören, warum das eine Voraussetzung sein könnte. ;)

+20

a [i: j] = sortiert (a [i: j]) scheint besser – SurDin

+1

Nun, würde diese künstliche Anforderung nicht einen Sinn ergeben, wenn, sagen wir mal, die Liste wirklich riesig ist? – Headcrab

+1

@SurDin: Veröffentlichen Sie das bitte als separate Antwort. –

0

Basierend auf Ihren Anforderungen, würde ich vorschlagen, Ihre eigene Sortierfunktion/Wrapper-Klasse für die Liste mit einer Sortierfunktion zu erstellen, die Ihre Anforderung erfüllt.

Sie könnten das DSU-Idiom oder die Schwartztian-Transformation in Betracht ziehen: Siehe http://wiki.python.org/moin/HowTo/Sorting und http://wiki.python.org/moin/PythonSpeed/PerformanceTips. Ich schlage vor, Sie schmücken mit 0 bis i, das Element zwischen i und j und 0 wieder j weiter. Verwenden Sie dann eine benutzerdefinierte Vergleichsfunktion, um 0 zurückzugeben, wenn entweder x oder y null ist, um die Sortierung zu erhalten! Dies kann nicht helfen, da wir Python V2.4 längst überschritten haben. Trotzdem könnte dies das sein wonach Sie suchen.

Diese Antwort füllt sich, während ich versuche, herauszufinden, ob es mit weniger Aufwand getan werden kann!

37

ich es auf diese Weise schreiben würde:

a[i:j] = sorted(a[i:j]) 

Es ist nicht an Ort und Stelle Art entweder, aber schnell genug für relativ kleine Segmente.

Bitte beachten Sie, dass Python nur Objektreferenzen kopiert, so dass die Geschwindigkeitstransparenz im Vergleich zu einer realen In-Place-Sortierung nicht so groß ist, wie man erwarten würde.

+0

Das OP fragte tatsächlich nach ganzen Zahlen. Bei einem Integer-Array sollte das Kopieren von Referenzen nicht wesentlich schneller sein als das Kopieren der tatsächlichen Werte. – log0

+0

Die Frage besagt nicht, dass die Liste nur Ganzzahlen enthalten kann. Das C++ - Beispiel arbeitet zwar mit ganzen Zahlen, aber das bedeutet nicht, dass sich die Frage nur darauf beschränkt. – fviktor

12

wenn a ein numpy Array wird dann [i, j) Bereich in-place, Typ zu sortieren:

a[i:j].sort() 

Beispiel:

>>> import numpy as np 
>>> a = np.array([4, 8, 1, 7, 3, 0, 5, 2, 6, 9]) 
>>> a[1:4].sort() 
>>> a 
array([4, 1, 7, 8, 3, 0, 5, 2, 6, 9]) 
-3

Sie können einfach die Liste Methode sort verwenden, z.B.

>>> a = [2,3,1] 
>>> a.sort() 
>>> a 
[1, 2, 3] 
+2

Die Frage war, wie man _part_ einer Liste sortiert. – ThomasMcLeod

+0

Wenn Sie eine Liste sortieren können, können Sie jeden Teil einer Liste sortieren, da [i: j] auch eine Liste bildet – user107852

2

Es ist ein weiterer einfachen approach.let Sie einen Array haben

a = [4, 8, 1, 7, 3, 0, 5, 2, 6, 9] 

und Sie mögen einen Teil dieses Arrays sortieren, zu sagen, aus dem Index 2 Index 7 in einem Null basierenden Index, dh von Element 1 bis 2.

b = a[2:7+1] 
b.sort() 
a[2:7+1] = b 
0

Hier ist die Referenz von python wiki

Basical ly, die sorted(list) erstellt neue sortierte Liste jedoch list.sort() Methode kann Ihnen für In-Place-Sortierung helfen.

>>> list = [(3, 5), (4, 7), (1, 5)] 
    >>> sorted(list) 
    [(1, 5), (3, 5), (4, 7)] 
    >>> list.sort() 
    [(1, 5), (3, 5), (4, 7)] 
Verwandte Themen