Hallo an alle ,
ich soll eine Fuktion/Funktor schreiben die durch :
>>> array.sort(myordering)
aufgerufen wird und dann absteigend sortiert.
Die Funktion/Funktor myordering(x,y) enthält die Objekte x und y. Die Objekte sollen nur "<" als Operator unterstützen.
Ich weiß, dass ich alle Vergleiche durch:
a = b ⇔ ¬(a < b) ∧ ¬(b < a)
a ≠ b ⇔ (a < b) ∨ (b < a)
a ≤ b ⇔ ¬(b < a)
a > b ⇔ b < a
a ≥ b ⇔ ¬(a < b)
ausdrücken kann.
Wie fängt man da am besten an?
Was und wie muss ich die Werte zurückgeben?
Weiß vielleicht jemand was ein dreiwertiger Vergleich ist?
Ich will nicht und weiß, dass es hier unerwünscht ist ein Lösung zu erwarten
Ich bin auf der Suche nach Hilfe
Eigene Sortiermethode nur mit dem "kleiner als" Operator
@paupau90: Also zu dreiwertiger Vergleich fällt mir in diesem Zusammenhang ein, dass die Vergleichsfunktion die Du da schreiben musst drei mögliche Rückgabewerte hat. -1, 0, und 1, je nach dem ob `a` kleiner, gleich, oder grösser als `b` ist. Und von den ganzen Äquivalenzen brauchst Du eigentlich nur eine, denn wenn man von einer totalen Ordnung auf den Werten ausgehen kann (kann man?), dann brauchst Du neben dem a < b ja nur noch einen anderen Fall abprüfen, und dann bleibt ja nur noch eine Möglichkeit übrig die man deshalb nicht mehr explizit prüfen muss. Für den zweiten Prüfffall würde ich mir die einfachste Variante aussuchen.
- pillmuncher
- User
- Beiträge: 1484
- Registriert: Samstag 21. März 2009, 22:59
- Wohnort: Pfaffenwinkel
Ich würde so anfangen:paupau90 hat geschrieben:>>> array.sort(myordering)
...
Wie fängt man da am besten an?
Was und wie muss ich die Werte zurückgeben?
Code: Alles auswählen
def myordering(...):
return ...
Übrigens: Arrays sind keine Listen.
In specifications, Murphy's Law supersedes Ohm's.
@ BlackJack: Als prüfe ich, ob x < y und y < x wenn das nicht zutrifft muss x == y sein. Habe ich dich da richtig verstanden?
Mach ich dann "return 1" bzw "return -1" bzw "return 0"?
Kennt jemand den passenden Teil aus der Python Docu oä. zu array.sort(myordering)?
Mach ich dann "return 1" bzw "return -1" bzw "return 0"?
Kennt jemand den passenden Teil aus der Python Docu oä. zu array.sort(myordering)?
@paupau90: Hör doch mal auf Listen ständig als `array` zu bezeichnen, das ist verwirrend. Der Index in der Python-Dokumentation verweist bei `sort() (list method)` auf diese Stelle: https://docs.python.org/2.7/library/std ... l#index-30
Und was ist mit Ruby-Arrays oder Arrays in JavaScript...?
Ich glaube, recht viele Sprachen außer Python bezeichnen Listen als Arrays. Deshalb ist es wohl eher verwirrend für den Umsteiger von einer anderen Sprache zu Python. Wobei ich der Unterscheidung wie Python sie vornimmt durchaus zustimme. Arrays sind für mich unveränderlich in ihrer Größe und können nur an bereits initialisierten Stellen neu mit Objekten belegt werden (die Magie für das direkte Setzen der Elemente bei Erzeugung des Arrays jetzt mal außen vor gelassen). Listen dagegen ändern ihre Größe dynamisch.
Ich glaube, recht viele Sprachen außer Python bezeichnen Listen als Arrays. Deshalb ist es wohl eher verwirrend für den Umsteiger von einer anderen Sprache zu Python. Wobei ich der Unterscheidung wie Python sie vornimmt durchaus zustimme. Arrays sind für mich unveränderlich in ihrer Größe und können nur an bereits initialisierten Stellen neu mit Objekten belegt werden (die Magie für das direkte Setzen der Elemente bei Erzeugung des Arrays jetzt mal außen vor gelassen). Listen dagegen ändern ihre Größe dynamisch.
@snafu: Es ist egal wie das in anderen Sprachen gehandhabt wird, es wurde kurz vorher schon darauf hingewiesen wie das in Python aussieht, und wenn man nach `array.sort()` sucht, ist das dann halt nicht so zielführend, weil die Dokumentation das nicht kennt, sondern `sort() (list method)` im Index steht und nicht `sort() (array method)`. Und sind das echt so viele Sprachen? Basic, C, C#, C++, Clojure, Pascal (und Delphi), Haskell, Io, Java, Rust, Scheme, und Smalltalk nennen Listen zum Beispiel nicht Array.
Darf man da auch nur < benutzen? Könnte knifflig werden ohne modulo.
MorgenGrauen: 1 Welt, 8 Rassen, 13 Gilden, >250 Abenteuer, >5000 Waffen & Rüstungen,
>7000 NPC, >16000 Räume, >200 freiwillige Programmierer, nur Text, viel Spaß, seit 1992.
>7000 NPC, >16000 Räume, >200 freiwillige Programmierer, nur Text, viel Spaß, seit 1992.
@Kebap: Nur mit ``<`` es kniffelig werden, aber wenn's ganze Zahlen sind kann man auch was anderes als den Modulo-Operator verwenden.
Klar. Ich wollte auch nicht infrage stellen, dass man Listen in Python nicht "Listen" nennen soll, auch wenn man meinen Beitrag durchaus so interpretieren konnte.BlackJack hat geschrieben:@snafu: Es ist egal wie das in anderen Sprachen gehandhabt wird, es wurde kurz vorher schon darauf hingewiesen wie das in Python aussieht, und wenn man nach `array.sort()` sucht, ist das dann halt nicht so zielführend, weil die Dokumentation das nicht kennt, sondern `sort() (list method)` im Index steht und nicht `sort() (array method)`.
Da rächt es sich, wenn man zu faul ist (bzw heute Morgen auch zu wenig Zeit hatte), um seine Aussagen nochmal zu überprüfen...BlackJack hat geschrieben:Und sind das echt so viele Sprachen? Basic, C, C#, C++, Clojure, Pascal (und Delphi), Haskell, Io, Java, Rust, Scheme, und Smalltalk nennen Listen zum Beispiel nicht Array.
@paupau90:
Und dann ``eine_liste_mit_ganzen_zahlen.sort(key=key_func)``.
Code: Alles auswählen
def key_func(value):
is_odd = value & 1
return (is_odd, -value if is_odd else value)