Seite 1 von 1

Eigene Sortiermethode nur mit dem "kleiner als" Operator

Verfasst: Mittwoch 2. Juli 2014, 21:00
von paupau90
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 :-D
Ich bin auf der Suche nach Hilfe :-)

Re: Eigene Sortiermethode nur mit dem "kleiner als" Operator

Verfasst: Mittwoch 2. Juli 2014, 21:34
von BlackJack
@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.

Re: Eigene Sortiermethode nur mit dem "kleiner als" Operator

Verfasst: Mittwoch 2. Juli 2014, 21:34
von pillmuncher
paupau90 hat geschrieben:>>> array.sort(myordering)
...
Wie fängt man da am besten an?
Was und wie muss ich die Werte zurückgeben?
Ich würde so anfangen:

Code: Alles auswählen

def myordering(...):
    return ...
Du brauchst bloß die ... durch etwas sinnvolles ersetzen, so wie hier beschrieben. Wenn dir dabei etwas unklar ist, einfach hier nochmal konkreter fragen.
Übrigens: Arrays sind keine Listen.

Re: Eigene Sortiermethode nur mit dem "kleiner als" Operator

Verfasst: Donnerstag 3. Juli 2014, 08:17
von paupau90
@ 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)?

Re: Eigene Sortiermethode nur mit dem "kleiner als" Operator

Verfasst: Donnerstag 3. Juli 2014, 08:26
von BlackJack
@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

Re: Eigene Sortiermethode nur mit dem "kleiner als" Operator

Verfasst: Donnerstag 3. Juli 2014, 08:40
von snafu
Und was ist mit Ruby-Arrays oder Arrays in JavaScript...? :twisted:

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.

Re: Eigene Sortiermethode nur mit dem "kleiner als" Operator

Verfasst: Donnerstag 3. Juli 2014, 10:10
von BlackJack
@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.

Re: Eigene Sortiermethode nur mit dem "kleiner als" Operator

Verfasst: Donnerstag 3. Juli 2014, 11:22
von paupau90
Vilen Dank für die Hilfe hat super funktioniert.

Vielleicht hat jemand eine Idee wie man eine Liste von Zahlen zuerst alle geraden Zahlen aufsteigend und danach alle ungeraden Zahlen
absteigende sortiert.

Re: Eigene Sortiermethode nur mit dem "kleiner als" Operator

Verfasst: Donnerstag 3. Juli 2014, 11:59
von BlackJack
@paupau90: Ja, habe ich. :-)

Re: Eigene Sortiermethode nur mit dem "kleiner als" Operator

Verfasst: Donnerstag 3. Juli 2014, 12:25
von Kebap
Darf man da auch nur < benutzen? Könnte knifflig werden ohne modulo.

Re: Eigene Sortiermethode nur mit dem "kleiner als" Operator

Verfasst: Donnerstag 3. Juli 2014, 12:27
von BlackJack
@Kebap: Nur mit ``<`` es kniffelig werden, aber wenn's ganze Zahlen sind kann man auch was anderes als den Modulo-Operator verwenden. :-)

Re: Eigene Sortiermethode nur mit dem "kleiner als" Operator

Verfasst: Donnerstag 3. Juli 2014, 12:47
von paupau90
Es sind ganze Zahlen und man darf mehr als < verwenden :-)

Re: Eigene Sortiermethode nur mit dem "kleiner als" Operator

Verfasst: Donnerstag 3. Juli 2014, 13:19
von snafu
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)`.
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: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.
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... :oops:

Re: Eigene Sortiermethode nur mit dem "kleiner als" Operator

Verfasst: Donnerstag 3. Juli 2014, 13:38
von BlackJack
@paupau90:

Code: Alles auswählen

def key_func(value):
    is_odd = value & 1
    return (is_odd, -value if is_odd else value)
Und dann ``eine_liste_mit_ganzen_zahlen.sort(key=key_func)``.

Re: Eigene Sortiermethode nur mit dem "kleiner als" Operator

Verfasst: Donnerstag 3. Juli 2014, 13:55
von Sirius3
Sprachen, wo Listen Arrays sind: Perl, Javascript, Ruby

Re: Eigene Sortiermethode nur mit dem "kleiner als" Operator

Verfasst: Donnerstag 3. Juli 2014, 14:39
von BlackJack
Vielleicht noch D, wobei die das „dynamic arrays” nennen.