Eigene Sortiermethode nur mit dem "kleiner als" Operator

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
paupau90
User
Beiträge: 26
Registriert: Sonntag 4. Mai 2014, 16:32

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 :-)
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.
Benutzeravatar
pillmuncher
User
Beiträge: 1484
Registriert: Samstag 21. März 2009, 22:59
Wohnort: Pfaffenwinkel

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.
In specifications, Murphy's Law supersedes Ohm's.
paupau90
User
Beiträge: 26
Registriert: Sonntag 4. Mai 2014, 16:32

@ 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)?
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
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

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.
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.
paupau90
User
Beiträge: 26
Registriert: Sonntag 4. Mai 2014, 16:32

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.
BlackJack

@paupau90: Ja, habe ich. :-)
Benutzeravatar
Kebap
User
Beiträge: 687
Registriert: Dienstag 15. November 2011, 14:20
Wohnort: Dortmund

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.
BlackJack

@Kebap: Nur mit ``<`` es kniffelig werden, aber wenn's ganze Zahlen sind kann man auch was anderes als den Modulo-Operator verwenden. :-)
paupau90
User
Beiträge: 26
Registriert: Sonntag 4. Mai 2014, 16:32

Es sind ganze Zahlen und man darf mehr als < verwenden :-)
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

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:
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)``.
Sirius3
User
Beiträge: 17749
Registriert: Sonntag 21. Oktober 2012, 17:20

Sprachen, wo Listen Arrays sind: Perl, Javascript, Ruby
BlackJack

Vielleicht noch D, wobei die das „dynamic arrays” nennen.
Antworten