Liste in-suto beliebig sortieren bzw. neuordnen.

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Benutzeravatar
akis.kapo
User
Beiträge: 127
Registriert: Freitag 1. September 2006, 12:58

Hi all,

ich habe momentan das Problem, dass die einzige mir bekannte Methode eine Liste speicher-effizient und schnell umzusortieren, list.sort(cmp, key, ...) und random.shuffle(list) ist.

Das ist für meinen Einsatzzweck deswegen unpraktisch,
weil ich die Reihenfolge der Umsortierung bereits kenne
und diese mehr oder minder beliebig / zufällig ist.

random.shuffle(list) und list.sort() kann ich nicht verwenden.

Momentan verwende ich folgenden Code:

Code: Alles auswählen

def reorder(order, target):
    return [target[i] for i in order]
Das gibt ja jedes mal eine ganze Liste zurück.

Ich bräuchte sowas, wie random.shuffle() oder list.sort(cmp, key, ...), was in-suto / in-place / effizient & schnell arbeitet.

Gibt es da eine Möglichkeit oder von mir aus eine brauchbare Alternative (numpy, cStringIO, arrays, ...), wie man so etwas simulieren kann (tricksen ist erlaubt)?

Bitte um Hilfe.
Dank im Voraus.
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

Du könntest statt einer neuen Liste einfach einen Generator erzeugen, indem du statt der eckigen runde Klammern verwendest.
Benutzeravatar
akis.kapo
User
Beiträge: 127
Registriert: Freitag 1. September 2006, 12:58

numerix hat geschrieben:Du könntest statt einer neuen Liste einfach einen Generator erzeugen, indem du statt der eckigen runde Klammern verwendest.
A generator object is not subscribable. :(

Ich muss meinen Code erstmal umschreiben, um diesen Vorschlag überhaupt testen zu können.

EDIT: alternativ probiere ich einfach den alten Code auf python-3.x. Das macht doch AFAIK aus allen Listen Generatorobjekte, oder nicht?
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

akis.kapo hat geschrieben:EDIT: alternativ probiere ich einfach den alten Code auf python-3.x. Das macht doch AFAIK aus allen Listen Generatorobjekte, oder nicht?
Nein. Es gibt aber an viel mehr stellen wo früher Listen rauskamen, Generatoren aus.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

akis.kapo hat geschrieben:EDIT: alternativ probiere ich einfach den alten Code auf python-3.x. Das macht doch AFAIK aus allen Listen Generatorobjekte, oder nicht?
Ergänzend zu dem, was Leonidas gesagt hat: Das würde das Problem auch nicht lösen, denn wenn du irgendwo Indexzugriffe hast, dann funktionieren die auf Generator-Objekten eben nicht - egal ob mit Python 2 oder Python 3.

Um welche Größenordnungen (Listenlänge) und welche Art von Elementen geht es denn hier?
Benutzeravatar
akis.kapo
User
Beiträge: 127
Registriert: Freitag 1. September 2006, 12:58

numerix hat geschrieben:Um welche Größenordnungen (Listenlänge) und welche Art von Elementen geht es denn hier?
Elemente: Integer von 0 bis 255.
Listenlänge: maximal 65536 Elemente.
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

akis.kapo hat geschrieben:
numerix hat geschrieben:Um welche Größenordnungen (Listenlänge) und welche Art von Elementen geht es denn hier?
Elemente: Integer von 0 bis 255.
Listenlänge: maximal 65536 Elemente.
Und der Vorgang der Umordnung muss häufiger hintereinander durchgeführt werden?
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Ich sehe das Problem vom Geschwindigkeit und warum du deine alte Liste beibehalten willst noch nicht.

Code: Alles auswählen

target[::] = (target[i] for i in order)
Das Leben ist wie ein Tennisball.
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

EyDu hat geschrieben:Ich sehe das Problem vom Geschwindigkeit und warum du deine alte Liste beibehalten willst noch nicht.

Code: Alles auswählen

target[::] = (target[i] for i in order)
Ein Doppelpunkt tut es auch ...
Benutzeravatar
akis.kapo
User
Beiträge: 127
Registriert: Freitag 1. September 2006, 12:58

EyDu hat geschrieben:Ich sehe das Problem vom Geschwindigkeit und warum du deine alte Liste beibehalten willst noch nicht.

Code: Alles auswählen

target[::] = (target[i] for i in order)
UUuuhh, also im meinem Code und unter python 2.6.2 ist das sogar noch langsamer als einfach das Objekt neu zu referenzieren.

Code: Alles auswählen

target = reorder(order, target)
Frag mich aber nicht, wieso...
Benutzeravatar
Defnull
User
Beiträge: 778
Registriert: Donnerstag 18. Juni 2009, 22:09
Wohnort: Göttingen
Kontaktdaten:

Du könntest auch die order-liste überschreiben, wenn du sie nicht mehr brauchst. Das würde dir zumindest etwas Speicher sparen:

Code: Alles auswählen

for i in xrange(len(order)):
  order[i] = target[order[i]]
target = order
Ansonsten sehe ich keine in-place Möglichkeit.
Bottle: Micro Web Framework + Development Blog
Antworten