[Python-de] Denksportaufgabe: Beschraenktes Sortieren

Dinu Gherman gherman at darwin.in-berlin.de
Thu May 8 13:52:16 EDT 2003


René Liebscher:

> Also ich habe das or nur mittels lambda in reduce bekommen, or alleine
> wollte der nicht. Habe ich da eine Möglichkeit übersehen?
> Und ich vertraue darauf das das or nur bis zum ersten Nicht-0 wirklich
> durchrechnet und dann sein Ergebnis nicht mehr ändert.
>
> def sort(input,indizes):
> 	input.sort(lambda a,b,indizes=indizes:reduce(lambda x,y:x or
> y,[cmp(a[i],b[i]) for i in indizes]))
> 	return input

Prima - bestehend kurz! Kuerzer geht's wohl nimmer! Wenn auch ein
kleiner Brainteaser! ;-)

Allerdings frage ich mich auch, wieso reduce(operator.or_, ...) nicht
funktioniert (die 2 kommt beim Vergleichen natuerlich nicht vor...)?

   >>> 0 or 1 or 2
   1
   >>> reduce(operator.or_, [0, 1, 2])
   3

Aha, es ist ein binaeres ODER, ein logisches scheint es nicht zu ge-
ben (komisch, jetzt, wo es Booleans gibt)! D.h. man muss fummeln bis
man z.B. zu diesem als Ersatz fuer Dein reduce kommt (was sicher
*nicht* schoener ist):

   (filter(lambda x:x!=0, [...]) or [0])[0]

>> Sonderpunkte gibt es fuer denjenigen, der seine Loesung auf Struct-
>> aehnliche Instanzobjekte mit Attributen als Schluessel erweitert!
>
> a[i],b[i] im cmp durch getattr(a,i),getattr(b,i) ersetzen.

Geht, aber dann muss man zwei sort-Funktionen haben oder eine mit
Fallabfrage, isinstance(), oder so. Schoener finde ich, das der
Struct-Klasse zu ueberlassen, und __getitem__ auf __getattr__ um-
zubiegen! ;-)

Ich halte meine Loesung noch eine Weile zurueck, falls sich noch
andere daran versuchen wollen.

Dinu

--
Dinu C. Gherman
......................................................................
"Families is where our nation find hope, where wings take dream."
(George W. Bush, 18 Oct. 2000)





More information about the Python-de mailing list