Seite 1 von 1
Liste in-suto beliebig sortieren bzw. neuordnen.
Verfasst: Donnerstag 4. Februar 2010, 15:23
von akis.kapo
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.
Verfasst: Donnerstag 4. Februar 2010, 15:48
von numerix
Du könntest statt einer neuen Liste einfach einen Generator erzeugen, indem du statt der eckigen runde Klammern verwendest.
Verfasst: Donnerstag 4. Februar 2010, 16:01
von akis.kapo
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?
Verfasst: Donnerstag 4. Februar 2010, 16:43
von Leonidas
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.
Verfasst: Donnerstag 4. Februar 2010, 17:23
von numerix
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?
Verfasst: Donnerstag 4. Februar 2010, 17:29
von akis.kapo
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.
Verfasst: Donnerstag 4. Februar 2010, 17:31
von numerix
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?
Verfasst: Donnerstag 4. Februar 2010, 17:44
von EyDu
Ich sehe das Problem vom Geschwindigkeit und warum du deine alte Liste beibehalten willst noch nicht.
Verfasst: Donnerstag 4. Februar 2010, 18:08
von numerix
EyDu hat geschrieben:Ich sehe das Problem vom Geschwindigkeit und warum du deine alte Liste beibehalten willst noch nicht.
Ein Doppelpunkt tut es auch ...
Verfasst: Donnerstag 4. Februar 2010, 22:09
von akis.kapo
EyDu hat geschrieben:Ich sehe das Problem vom Geschwindigkeit und warum du deine alte Liste beibehalten willst noch nicht.
UUuuhh, also im
meinem Code und unter python 2.6.2 ist das sogar noch langsamer als einfach das Objekt neu zu referenzieren.
Frag mich aber nicht, wieso...
Verfasst: Donnerstag 4. Februar 2010, 22:14
von Defnull
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.