[Python-de] Denksportaufgabe: Beschraenktes Sortieren

René Liebscher R.Liebscher at gmx.de
Thu May 8 18:36:20 EDT 2003


Detlef Lannert schrieb:
> 
> > In Anbetracht des weiter verschobenen Berliner Python-Treffens habe
> > ich mir mal wieder eine kleine Denksportaufgabe ausgedacht, wenn's
> > recht ist?
> 
> Sicher darf man auch als Nichtberliner mitdenken?!
> 
> > Gesucht ist eine Sortierfunktion sort(sequence, indices=[]), die
> > "Sequenzen von Sammelobjekten" nach ganz bestimmten Indices (und nur
> > auf diese beschraenkt) sortiert zurueckgibt. Mit "Sammelobjekten"
> > sind hier Listen, Dictionaries und Strings gemeint (bei Dictionaries
> > sind die Indices also die Schluessel). Sammelobjekte duerfen ver-
> > schieden gross sein, mussen aber alle ueber die gewuenschten Indices
> > verfuegen.
> 
> Mein Vorschlag:
> 
> def sort(sequence, indices=[]):
>     auxlist = [([x[i] for i in indices], x) for x in sequence]
>     auxlist.sort()
>     return [x[1] for x in auxlist]
>
> Liefert ein IMO richtiges, aber nicht immer das "vorgesehene"
> Ergebnis (bei Gleichheit der Sortierbegriffe wird hier nach der
> Sequenz selbst weitersortiert).

In Python 2.2 (welches ich nicht habe) müsste dieses Problem mit dict()
aus der Welt zu schaffen sein. Nur die Schlüssel werden sortiert.

 def sort(sequence, indices=[]):
     auxdict = dict([([x[i] for i in indices], x) for x in sequence])
     auxlist=auxdict.keys()
     auxlist.sort()
     return [auxdict[x] for x in auxlist]
 
> 
> Schlägt sicher nicht den Rekord für die kürzeste Lösung, aber angesichts
> der Unbeliebtheit von map & Co. in gewissen Kreisen würde ich diesen
> Vorschlag als "ziemlich pythonisch" ansehen ;-)) ...
> 
> Damit ist allerdings noch nicht der Zugriff auf Attribute von Objekten
> abgehakt. Nach einer _eleganten_ Lösung dafür suche ich noch ...

Nicht extrem elegant aber statt x[i] in der zweiten Zeile

((type(x) != types.InstanceType) and x) or x.__dict__)[i]

und noch irgendwo ein import types davor. Das liest bei eigenen Objekten
dann das __dict__ aus,
ansonstens wird es direkt versucht.

MfG
Rene Liebscher

> 
>   Detlef




More information about the Python-de mailing list