liste einfügen und numerisch sortieren

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
nivrakm
User
Beiträge: 1
Registriert: Sonntag 21. November 2021, 13:24

Hallo,
ich habe folgenden code geschrieben

#Dauersschleife des Programms
while 1:
liste = []
#import der random randint funktion
from random import randint
#einlesen der anzahl der Würfel
x=int(input("wie viel Würfel darfst du benutzen:"))
#begrenzung der Maximalen würfel zahl auf 20
if x > 20:
#beenden des programms mit eingabe von 999
if x == 999:
print("auf wiedersehen")
exit()
#ausgeben der Fehlermeldung bei zahlen Größer 20 und nicht 999
else:
print("F40")
print("du gibst eine Zahl ein die größer ist als in der Spielwelt sinn macht!")
print("gebe 999 ein um das Programm zu beenden")
# wenn x == 1 dann ausgabe von random würfelzahl
elif x == 1:
z= randint(1,6)
print(z)
print()
elif x == 0:
print("F40")
print("keine Eingabe ist nicht möglich")
print()

# schleife mit zorn und anzahl der Durchgänge gegeben durch x (input)
else:
f=0
for j in range (1,x):
z= randint(1,6)
#ausgabe der einzelnen durchgänge der schleife
print(z)
# Berechnung der random Würfelzahl für zorn
zorn=randint(1,6)
#ausgabe des Zorns
print("Zorn:")
print(zorn)
print()
#ausgabe von kommentaren zum Zorn
if zorn == 6:
print("max Punktzahl erreicht")
print("HERZLICHEN GLÜCKWUNSCH")
print()
elif zorn == 1:
print("HAAA HAAA")
print()
else:
print()

kann mir jemand helfen die variable z in eine liste zu packen und diese numerisch zu sortieren?
Benutzeravatar
noisefloor
User
Beiträge: 4195
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

woran scheitert es bei dir denn genau? Was hat du versucht, was hat nicht funktioniert?

Listen anlegen und erweitern ist im Python Grundlagentutorial auf docs.python.org erklärt und Listen-Objekte haben eine `sort()` Methode. Außerdem gibt es in der Python Doku ein "Sorting Tutorial" (https://docs.python.org/3/howto/sorting.html).

Bitte Code in Zukunft in einen Codeblock setzen, damit der lesbar ist! Den Codeblock erreichst du, indem du im vollständigen Editor auf die </> Schaltfläche klickst.

Gruß, noisefloor
Benutzeravatar
__blackjack__
User
Beiträge: 14076
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@nivrakm: Anmerkungen zum Quelltext: Python hat einen Datentyp (`bool`) für Wahrheitswerte und Werte für diesen Datentyp (`True`, `False`). Da sollte man nicht 1 und 0 für missbrauchen.

Kommentare sollen dem Leser einen Mehrwert über den Code geben. Faustregel: Kommentare beschreiben nicht *was* der Code macht, denn das steht da bereits als Code, sondern warum er das macht. Sofern das nicht offensichtlich ist. Offensichtlich ist in aller Regel auch was in der Dokumentation von Python und den verwendeten Bibliotheken steht.

Eine weitere Klasse von Kommentaren sind solche die erklären was ein schlechter Name bedeuten soll. Wenn man beispielsweise `x` sinnvoll benennen würde, bräuchte man keinen Kommentar was der Wert von `x` eigentlich bedeuten soll.

Importe werden am Anfang von Modul gemacht, damit man leicht sehen kann wovon das Modul abhängig ist.

`exit()` gibt es eigentlich gar nicht wenn man das nicht aus `sys` importiert. Man sollte die Funktion auch nicht verwenden wenn man nicht wenigstens potentiell einen anderen Rückgabecode als 0 an den Aufrufer kommunizieren möchte. Ansonsten würde man hier einfach die Schleife verlassen und das Programm ganz ”natürlich” zum Ende kommen lassen.

Die Fälle beim ``if``/``elif`` würde ich anders sortieren. Besondere Fälle und ”normale” Fälle gruppieren, und die besonderen Fälle zuerst behandeln. Das macht den Code übersichtlicher und weniger überraschend für den Leser. Dann sieht man auch besser ob man alle relevanten Fälle abgedeckt hat. Wo landet bei Dir denn beispielsweise der Programmfluss wenn der Benutzer eine negative Zahl eingibt, und ist das so gewollt?

`f` wird definiert, aber nirgends verwendet. Und der Wert von `j` wird nicht verwendet. Für Namen die man aus syntaktischen oder API-Gründen schreiben muss, die aber nicht verwendet werden, nimmt man per Konvention den Namen `_`. Damit weiss der Leser sofort, dass der Wert nicht verwendet wird, und dass das kein Fehler, sondern so beabsichtigt ist.

Der Fall Würfelanzahl 1 ist im allgemeinen Fall eigentlich enthalten. Das würde ich keinen extra Zwei für verwenden. Die Unterscheidung ob Zorn würfelt, kann man auch *in* diesem allgemeinen Fall treffen.

Die Schleife zum Würfeln für den Spieler würde ich nicht von 1 an laufen lassen. Das macht es undurchsichtiger als es sein müsste das der Spieler mit einem Würfel weniger würfelt als Würfelanzahl angibt. Das wäre wesentlich deutlicher wenn da tatsächlich ein ``wuerfelanzahl - 1`` im Code stehen würde.

`liste` ist kein guter Name. Der verrät dem Leser nicht was er eigentlich wissen will: Was bedeuten die Werte in dieser Liste. Und man sollte den Namen auch nicht so weit von der Stelle entfernt definieren wo er dann tatsächlich verwendet wird.

Listen haben eine Methode um Werte anzuhängen, und eine Methode um die Liste zu sortieren. Arbeite am besten mal das Tutorial in der Python-Dokumentation durch. Da werden die Grundlagen erklärt. Und man kann natürlich auch jederzeit in der Dokumentation nachlesen was für Operationen auf den Datentypen definiert sind und was die jeweils machen.

Wenn am Anfang oder am Ende von allen ``if``/``elif``/``else``-Zweigen gleicher Code steht, sollte der *einmal* vor beziehungsweise nach diesem Konstrukt stehen, und nicht in jedem Zweig.

Beim Zorn fällt dann der ``else``-Zweig weg, denn der ist dann leer.

Zwischenstand (ungetestet):

Code: Alles auswählen

#!/usr/bin/env python3
from random import randint


def main():
    while True:
        wuerfelanzahl = int(input("Wie viele Würfel darfst Du benutzen: "))
        if wuerfelanzahl == 999:
            print("Auf Wiedersehen.")
            break

        if wuerfelanzahl <= 0:
            print("F40")
            print("Keine Eingabe oder eine negative Anzahl sind nicht erlaubt")
            print()

        elif wuerfelanzahl > 20:
            print("F40")
            print(
                "Du gibst eine Zahl ein, die größer ist als in der Spielwelt"
                " Sinn macht!"
            )
            print("Gebe 999 ein um das Programm zu beenden.")

        else:
            spielerwuerfe = []  # TODO Etwas sinnvolles mit der Liste machen.
            for _ in range(0, wuerfelanzahl - 1):
                spielerwurf = randint(1, 6)
                print(spielerwurf)

            if wuerfelanzahl - 1 != 0:
                zorn_wurf = randint(1, 6)
                print("Zorn:")
                print(zorn_wurf)
                print()
                if zorn_wurf == 1:
                    print("HAAA HAAA")
                elif zorn_wurf == 6:
                    print("Maximale Punktzahl erreicht.")
                    print("HERZLICHEN GLÜCKWUNSCH")
                print()


if __name__ == "__main__":
    main()
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Antworten