Prüfen ob eine Liste sortiert ist

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
kimller
User
Beiträge: 6
Registriert: Sonntag 27. Mai 2018, 00:25

Hallo,

ich programmiere noch nicht sehr lange. Das mal vorneweg:)
Ich brauche zwei verschiedene Codes, mit welchen man kontrollieren kann, ob eine Liste sortiert ist oder nicht. Also wenn man eine Liste prüft soll nur ein bool rauskommen ob sie sortiert ist oder nicht. Ich habe danach gegoogelt aber nichts gefunden. Würde mich freuen falls jemand helfen kann.

KM
__deets__
User
Beiträge: 14536
Registriert: Mittwoch 14. Oktober 2015, 14:29

Und das hast du dir selbst ausgedacht, oder dein Lehrer?
Benutzeravatar
noisefloor
User
Beiträge: 3856
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

der simpelste und naheliegendste Ansatz wäre doch wohl, die Liste zu sortieren und dann das Ergebnis mit der Ausgangsliste zu vergleichen.

Alternativ kannst du auch aber über die Liste iterieren und schauen, ob das Element am Index x kleiner ist das am Index x+1. "kleiner" bezieht sich dabei natürlich auf dein Sortierkriterium (was wir ja nicht kennen).

Wieso brauchst du zwei Codes? Einer reicht doch dafür...

Gruß, noisefloor
Benutzeravatar
MagBen
User
Beiträge: 799
Registriert: Freitag 6. Juni 2014, 05:56
Wohnort: Bremen
Kontaktdaten:

noisefloor hat geschrieben: Sonntag 27. Mai 2018, 07:41 "kleiner" bezieht sich dabei natürlich auf dein Sortierkriterium (was wir ja nicht kennen).
Das Sortierkriterium muss als bekannt vorausgesetzt werden, sonst würde die ganze Aufgabe keinen Sinn machen.
a fool with a tool is still a fool, www.magben.de, YouTube
Benutzeravatar
noisefloor
User
Beiträge: 3856
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

MagBen hat geschrieben: Sonntag 27. Mai 2018, 09:49
noisefloor hat geschrieben: Sonntag 27. Mai 2018, 07:41 "kleiner" bezieht sich dabei natürlich auf dein Sortierkriterium (was wir ja nicht kennen).
Das Sortierkriterium muss als bekannt vorausgesetzt werden, sonst würde die ganze Aufgabe keinen Sinn machen.
Schon klar. "iwir" bezieht sich auf die Hilfswilligen hier im Forum, nicht den TE :-)

Gruß, noisefloor
kimller
User
Beiträge: 6
Registriert: Sonntag 27. Mai 2018, 00:25

Hi,
danke erstmal für die ganzen Antworten :)
Also wir haben einen worst_code bekommen und sollen ihn "verbessern" und dann good_code nennen. Dieser worst_code kann dir später sagen, ob eine Liste sortiert ist oder nicht. Weil der Code nicht ganz so super ist ;) sollen wir zwei Alternativen im Internet finden, die dir auch sagen können ob eine Liste sortiert ist oder nicht.

Hier mal der worst_code (sorry, hab noch nicht rausgefunden wie ich das wie in einem Editor formatieren kann...):

# Beschreibung des Moduls `ListIsSorted`. Dieses
# Modul schaut, ob eine Liste absteigend
# sortiert angezeigt wird


def ListIsSorted(list: list) -> bool:
'''
This function looks if a list is sorted by going
through every item in the list given by any user
and then looks if at least the second item was
reached if the item before is a greater number than
the actual one.

list: Liste von Nummern
return: Rückgabewert
'''
if len(list) == 0 or len(list) == 1:
print("Keine Aussage möglich")

if len(list) == 0: # list has length 0!
# return simply the list
return list
elif len(list) == 1:
# TODO: maybe a good idea without elif?
a = []
for b in list:
b = int(b)
if isinstance(b, int):
print("is instance true" )
a.append(b)
else:
# do nothing
x = 0
return a
else:
sorted = True
while sorted:
y = -10e100000
for x in list:
if x > y:
sorted = True
y = x
continue
else:
sorted = False
y = x
break
break
return bool(sorted)
return sorted




def proof(cmpr):
resultingcmpr = "overwrite this"
for round in cmpr:
while round is not cmpr[-1]:
if round == cmpr[0]:
continue
else:
if round < cmpr[round - 1]:
resultingcmpr = True
return resultingcmpr


if __name__ == "worst_code":
print("ListIsSorted started")
elif __name__ == "__main__":
print("ListIsSorted imported")

Code: Alles auswählen

[Python][Python]
[/Python][/Python]
Benutzeravatar
kbr
User
Beiträge: 1487
Registriert: Mittwoch 15. Oktober 2008, 09:27

Der Programmcode muß *zwischen* die Python-Tags, die ja schon gefunden hast. Die Bezeichnung worst_code ist sicherlich treffend. Das es aber die Aufgabe sein soll, im Internet zwei bessere Alternativen zu suchen, finde ich erstaunlich.
Sirius3
User
Beiträge: 17747
Registriert: Sonntag 21. Oktober 2012, 17:20

Was ist denn das für eine Methode zu lernen? Im Internet nach besserem Code suchen, zu einem Problem, das selten eine Lösung braucht.

Ich dachte, das „schlecht“ in ›worse_code‹ bezieht sich auf den Algorithmus und nicht auf den Code an sich. Die beiden Fälle "Länge der Liste ist 0 oder 1" liefern eine Liste zurück, statt eines Wahrheitswertes. Es wird ein beliebiger Wert in ein int umgewandelt, um dann zu prüfen, ob da wirklich auch ein int rauskommt? Also ist das nicht nur eine schlechter, sondern ein kaputter Code.

`-10e100000` ist normalerweise nicht mit Floats darstellbar, gibt also -inf, was man auch direkt angeben könnte. Eine while-Schleife, die nach dem ersten Durchlauf abbricht, ist auch quatsch.

Wenn man also allen unnützen Code und Fehler entfernt, bleibt das:

Code: Alles auswählen

def list_is_sorted(list):
    '''
    This function looks if a list is sorted by going
    through every item in the list given by any user
    and then looks if at least the second item was
    reached if the item before is a greater number than
    the actual one.

    list: Liste von Nummern
    return: True if list is sorted otherwise False
    '''
    y = -math.inf
    for x in list:
        if x <= y:
            return False
        y = x
    return True
Da sieht man auch wieder schön, dass Leute, die Typannotations benutzen, eine dynamische Programmiersprache nicht verstanden haben. Im ursprünglichen Code war der Rückgabewert falsch, und die Parameter zu eingeschränkt, da man auch jedes beliebige Iterierbare Objekt übergeben kann. Da sollte man seine Energie lieber in einen korrekten Doc-String stecken.

Was die Funktion `proof` machen sollt, wird mir aber nicht klar, außer, dass es eine Endlosschleife ist, die man auch einfacher machen könnte.
kimller
User
Beiträge: 6
Registriert: Sonntag 27. Mai 2018, 00:25

kbr hat geschrieben: Sonntag 27. Mai 2018, 12:31 Der Programmcode muß *zwischen* die Python-Tags, die ja schon gefunden hast. Die Bezeichnung worst_code ist sicherlich treffend. Das es aber die Aufgabe sein soll, im Internet zwei bessere Alternativen zu suchen, finde ich erstaunlich.
ah super danke:) nächstes mal dann
kimller
User
Beiträge: 6
Registriert: Sonntag 27. Mai 2018, 00:25

Ah okay...naja. Die Methode hab ich nicht ausgesucht ;)
Gibt es denn andere codes oder Funktionen?

Die gekürzte Variante sieht echt übersichtlicher aus :lol:
Sirius3 hat geschrieben: Sonntag 27. Mai 2018, 12:50 Was ist denn das für eine Methode zu lernen? Im Internet nach besserem Code suchen, zu einem Problem, das selten eine Lösung braucht.

Ich dachte, das „schlecht“ in ›worse_code‹ bezieht sich auf den Algorithmus und nicht auf den Code an sich. Die beiden Fälle "Länge der Liste ist 0 oder 1" liefern eine Liste zurück, statt eines Wahrheitswertes. Es wird ein beliebiger Wert in ein int umgewandelt, um dann zu prüfen, ob da wirklich auch ein int rauskommt? Also ist das nicht nur eine schlechter, sondern ein kaputter Code.

`-10e100000` ist normalerweise nicht mit Floats darstellbar, gibt also -inf, was man auch direkt angeben könnte. Eine while-Schleife, die nach dem ersten Durchlauf abbricht, ist auch quatsch.

Wenn man also allen unnützen Code und Fehler entfernt, bleibt das:

Code: Alles auswählen

def list_is_sorted(list):
    '''
    This function looks if a list is sorted by going
    through every item in the list given by any user
    and then looks if at least the second item was
    reached if the item before is a greater number than
    the actual one.

    list: Liste von Nummern
    return: True if list is sorted otherwise False
    '''
    y = -math.inf
    for x in list:
        if x <= y:
            return False
        y = x
    return True
Da sieht man auch wieder schön, dass Leute, die Typannotations benutzen, eine dynamische Programmiersprache nicht verstanden haben. Im ursprünglichen Code war der Rückgabewert falsch, und die Parameter zu eingeschränkt, da man auch jedes beliebige Iterierbare Objekt übergeben kann. Da sollte man seine Energie lieber in einen korrekten Doc-String stecken.

Was die Funktion `proof` machen sollt, wird mir aber nicht klar, außer, dass es eine Endlosschleife ist, die man auch einfacher machen könnte.
Benutzeravatar
kbr
User
Beiträge: 1487
Registriert: Mittwoch 15. Oktober 2008, 09:27

@Sirius3: Ich gehe davon aus, dass es nicht wirklich Aufgabe war "Im Internet nach besserem Code suchen".
kimller
User
Beiträge: 6
Registriert: Sonntag 27. Mai 2018, 00:25

kbr hat geschrieben: Sonntag 27. Mai 2018, 13:32 @Sirius3: Ich gehe davon aus, dass es nicht wirklich Aufgabe war "Im Internet nach besserem Code suchen".
Das ist die Aufgabenstellung...

5. (2 Punkte) Finden Sie zwei verschiedene Lösungen für dieses Problem im Internet. Sie müssen
den Code nicht unbedingt verstehen. Die Signaturen sollten Sie aber folgendermaßen anpassen:
"is_sorted_1(list array) -> bool" und "is_sorted_2(list array) -> bool". Die Lösungen sollen
für Python >= 3.5 funktionieren. Schreiben Sie diese Funktionen einfach noch in good_code.py
hinzu. Dokumentieren gehört natürlich dazu!
Benutzeravatar
kbr
User
Beiträge: 1487
Registriert: Mittwoch 15. Oktober 2008, 09:27

@kimller: ok. Dann ergeben sich aber – zumindest für mich – Fragen nach der Didaktik und dem gewünschten Lernziel.
Sirius3
User
Beiträge: 17747
Registriert: Sonntag 21. Oktober 2012, 17:20

Ziel ist es, noch viel schlechteren Code im Internet zu finden, den man nicht einschätzen kann, ob er das macht, was er soll und dann merkt, dass weder das, was der Lehrer präsentiert noch das, was es im Internet gibt, ohne eigenes Verständnis sinnvoll nutzbar ist.
kimller
User
Beiträge: 6
Registriert: Sonntag 27. Mai 2018, 00:25

Ich kann die Aufgbe leider nicht ändern :)
Aber vielen Dank für all eure Hilfe! Schönen Sonntag euch noch;)
Benutzeravatar
ThomasL
User
Beiträge: 1366
Registriert: Montag 14. Mai 2018, 14:44
Wohnort: Kreis Unna NRW

Sirius3 hat geschrieben: Sonntag 27. Mai 2018, 14:17 Ziel ist es, noch viel schlechteren Code im Internet zu finden, den man nicht einschätzen kann, ob er das macht, was er soll und dann merkt, dass weder das, was der Lehrer präsentiert noch das, was es im Internet gibt, ohne eigenes Verständnis sinnvoll nutzbar ist.
:lol: :lol: :lol: super formuliert !
Ich bin Pazifist und greife niemanden an, auch nicht mit Worten.
Für alle meine Code Beispiele gilt: "There is always a better way."
https://projecteuler.net/profile/Brotherluii.png
Antworten