Erst mal Hallo zusammen,
Ich hoffe es ist OK, wenn ich als Anfänger auch "blöde Fragen" stelle.
Aktuell muss in der Schule ein Projekt zum Sortieren von Buchstaben mittels While-Schleife umgesetzt werden.
Ich weiß, dass es mit Listen der bessere Weg wäre, aber das soll eben nicht sein.
Das Problem ist, dass ich die Variable nicht hochzähen kann oder?
Also zB
Var1='B'
Var2='O'
Var3='S'
...
Die Sortierfunktion soll dann per Schleifen jeweils 2 Paare prüfen und dabei würde ich gerne
i=1
while...
If F(i) < F(x+1)...
Kann man das umsetzen?
Das Problem wird die Var... sein, das ist wohl ein String also kann man ihn nicht hochzählen...
Wie umgeht man das Problem?
Anfängerfrage Sortierfunktion While
- __blackjack__
- User
- Beiträge: 14052
- Registriert: Samstag 2. Juni 2018, 10:21
- Wohnort: 127.0.0.1
- Kontaktdaten:
Die Aufgabe sollte auch nicht verbieten vernünftige Namen zu wählen. Einbuchstabige Namen, kryptische Abkürzungen, und nummerierte Namen sind nicht vernünftig. Einbuchstabig geht in wenigen Ausnahmefällen, wie `i`, `j`, `k` als ganzzahlige Indexwerte oder `x` und `y` für Koordinaten.
Namen werden in Python klein_mit_unterstrichen geschrieben. Ausnahmen sind Konstanten (KOMPLETT_GROSS) und Klassen (MixedCase).
Namen werden in Python klein_mit_unterstrichen geschrieben. Ausnahmen sind Konstanten (KOMPLETT_GROSS) und Klassen (MixedCase).
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
-
- User
- Beiträge: 5
- Registriert: Dienstag 20. Oktober 2020, 13:21
Einfach der Größe nach. Die Variablen können Zahlen oder auch Buchstaben sein.__deets__ hat geschrieben: Dienstag 20. Oktober 2020, 17:09 Ich kann mir nicht vorstellen, dass du nicht mit einer Liste arbeiten sollst. Nur weil man while verwendet, muss man ja nicht auf Listen verzichten.Welches Sortierverfahren soll denn implementiert werden?
Ich habe es zunächst mal so hin bekommen, werde auch noch ein Script mit Liste und sortierbefehl erstellen (Quasi als +Aufgabe). Aber mich lässt das Problem, Variablen hochzählen zu können nicht los. (Halt weil ich mich mit "geht nicht" erst mal nie zufrieden gebe

Also
variable1 = 5
variable1 = 3
variable1 = 1
variable1 = 9
Würde nun gerne
x = 1
if variable(x) < variable (x+1):
...es folgt dann ein umstellen der variablen mittels hilfvariable
oder halt das nächste paar prüfen, bis alle in der richtigen Reihenfolge sind.
Aber egal was ich anstelle es geht nicht.
Wie gesagt ich bin noch blutiger ANfänger und mache learning by doing.
Ich vermute, dass die Aufzählung ja nicht gehen kann, da "variable1" ja ein string ist und die "1" eben keine Zahl...
Kann man da irgendiw ansetzen?
Wenn man mehrere Dinge hat, dann packt man die in eine geeignete Datenstruktur. In diesem Fall eine Liste. Und verteilt sie nicht auf eine feste Anzahl durchnummerierter(!) Namen! Das hat auch nichts geht nicht gibts nicht zu tun. Natürlich kannst du dir mit dem Akkubohrer in den Schädel bohren. Es ist nur eine so abwegige Idee, dass du niemanden finden wirst, der dir dabei hilft.
@Wichtelmann: Und es geht mit Sicherheit auch nicht darum, keine Liste zu verwenden. Es geht darum, die Sortierung mit einem eigenen Algorithmus vorzunehmen und nicht einen eigenen zu nehmen.
Und die Frage nach dem "Sortierverfahren" ist nicht die Frage nach dem Ergebnis, sondern nach dem Vorgehen, wie du die Sortierung durchführen möchtest.
Und die Frage nach dem "Sortierverfahren" ist nicht die Frage nach dem Ergebnis, sondern nach dem Vorgehen, wie du die Sortierung durchführen möchtest.
Wenn es einfach nur darum geht Zahlen einer Liste zu sortieren und buildin-Funktionen erlaubt sind (mit Ausnahme von sorted), dann wüürde ich folgendermaßen vorgehen:
Ich würde eine neue, leere Liste erstellen.
Dann würde ich die while Schleife starten, solange Zahlen in der zu sortierenden Liste sind.
An die neu erstellte Liste würde ich den kleinsten Wert der zu sortierenden Liste anhängen und diesen kleinsten Wert dann von den noch zu sortierenden entfernen.
Wenn die Schleife durchgelaufen ist, würde ich die neue, fertig sortierte Liste ausgeben.
Ist das eine Aufgabe vom Lehrer oder eine selbst ausgedachte Übungsaufgabe? Ich kann mir nicht vorstellen, dass euer Lehrer eine Möglichkeit ohne Listen verlangt. Hast du eine genaue Aufgabengestellung?
Ich würde eine neue, leere Liste erstellen.
Dann würde ich die while Schleife starten, solange Zahlen in der zu sortierenden Liste sind.
An die neu erstellte Liste würde ich den kleinsten Wert der zu sortierenden Liste anhängen und diesen kleinsten Wert dann von den noch zu sortierenden entfernen.
Wenn die Schleife durchgelaufen ist, würde ich die neue, fertig sortierte Liste ausgeben.
Ist das eine Aufgabe vom Lehrer oder eine selbst ausgedachte Übungsaufgabe? Ich kann mir nicht vorstellen, dass euer Lehrer eine Möglichkeit ohne Listen verlangt. Hast du eine genaue Aufgabengestellung?
-
- User
- Beiträge: 5
- Registriert: Dienstag 20. Oktober 2020, 13:21
Ich habe es jetzt mal so gelöst. Sicher stellen sich euch Profis dabei die Nackenhaare zu Berge aber es funktioniert.
Ich weiß dass es mit 2 Zeilen auch gehen würde
Ein Problem habe ich noch mit dem Füllen der Liste durch Benutzereingabe. Gibts da noch einen Tip?
Ich weiß dass es mit 2 Zeilen auch gehen würde

Ein Problem habe ich noch mit dem Füllen der Liste durch Benutzereingabe. Gibts da noch einen Tip?
Code: Alles auswählen
liste = [5, 7, 1, 9, 2, 4, 3]
#liste = ['B', 'G', 'A', 'H', 'X', 'C', 'F']
erster_wert = 0
zweiter_wert = 1
laenge = len(liste)
while zweiter_wert < laenge:
while erster_wert < len(liste):
for zweiter_wert in range(erster_wert, laenge):
if (liste[erster_wert]) > (liste[zweiter_wert]):
#print(liste)
#print('vergleiche ', erster_wert, "mit", zweiter_wert, " also ", liste[erster_wert], "mit", liste[zweiter_wert])
nummer_temporaer_1 = liste[erster_wert]
nummer_temporaer_2 = liste[zweiter_wert]
liste[erster_wert] = nummer_temporaer_2
liste[zweiter_wert] = nummer_temporaer_1
zweiter_wert = zweiter_wert + 1
else:
zweiter_wert = erster_wert + 1
erster_wert = erster_wert + 1
print(liste)
@Wichtelmann: Du hast drei Schleifen, wovon die äußerste Schleife überflüssig ist, weil Du ja in der innersten for-Schleife `zweiter_wert` schon hochzählst. Die Schleifenvariable innerhalb der Schleife zu ändern ist meist ein Zeichen, dass man etwas falsch macht, denn die Variable wird ja im nächsten Durchgang mit dem nächsten Wert überschrieben.
Ein else-Block für eine for-Schleife ohne break ist sinnlos, weil sie immer durchlaufen wird.
Mal verwendest Du `laenge`, mal `len(liste)`, ersteres ist nur eine Dopplung, eine Dopplung will man in der Programmierung aber nicht, weil sie nur zusätzliche Komplexität bringt.
Damit sind wir bei:
Jetzt hast Du eine while-Schleife, die nur aus dem Hochzählen eines Wertes besteht, ist eigentlich eine for-Schleife.
Das Austauschen der zwei Werte kann man einfacher schreiben. erster_wert und zweiter_wert sind eigentlich keine Werte sondern Indizes.
Die zweite Schleife läuft ab erster_index, aber erst ab erster_index+1 ist das nötig.
Ein else-Block für eine for-Schleife ohne break ist sinnlos, weil sie immer durchlaufen wird.
Mal verwendest Du `laenge`, mal `len(liste)`, ersteres ist nur eine Dopplung, eine Dopplung will man in der Programmierung aber nicht, weil sie nur zusätzliche Komplexität bringt.
Damit sind wir bei:
Code: Alles auswählen
liste = [5, 7, 1, 9, 2, 4, 3]
erster_wert = 0
while erster_wert < len(liste):
for zweiter_wert in range(erster_wert, len(liste)):
if liste[erster_wert] > liste[zweiter_wert]:
nummer_temporaer_1 = liste[erster_wert]
nummer_temporaer_2 = liste[zweiter_wert]
liste[erster_wert] = nummer_temporaer_2
liste[zweiter_wert] = nummer_temporaer_1
erster_wert = erster_wert + 1
print(liste)
Das Austauschen der zwei Werte kann man einfacher schreiben. erster_wert und zweiter_wert sind eigentlich keine Werte sondern Indizes.
Die zweite Schleife läuft ab erster_index, aber erst ab erster_index+1 ist das nötig.
Code: Alles auswählen
liste = [5, 7, 1, 9, 2, 4, 3]
for erster_index in range(len(liste)):
for zweiter_index in range(erster_index + 1, len(liste)):
if liste[erster_index] > liste[zweiter_index]:
liste[zweiter_index], liste[erster_index] = liste[erster_index], liste[zweiter_index]
print(liste)
-
- User
- Beiträge: 5
- Registriert: Dienstag 20. Oktober 2020, 13:21
oha! dake für die ausführlichen Hinweise. dann werde ich mal versuchen, das auch zu verstehen. Ich denke mit so einem Beispiel fällt mir das dann leicher, indem ich beiden Versionen vergleichen kann.
erster_index bzw. zweiter_index in einer "for erster_index in range(len(liste)):"-schleife sind dann automatisch immer der erste Listeneintrag? Weil ich ihn ja mit 0 erst mal umständlich definierte...?
erster_index bzw. zweiter_index in einer "for erster_index in range(len(liste)):"-schleife sind dann automatisch immer der erste Listeneintrag? Weil ich ihn ja mit 0 erst mal umständlich definierte...?
-
- User
- Beiträge: 5
- Registriert: Dienstag 20. Oktober 2020, 13:21
Naja in Deiner Bearbeitung steht jaSirius3 hat geschrieben: Donnerstag 22. Oktober 2020, 09:56 erster_index und zweiter_index sind ersteinmal nur Zahlen, die als Index in Deine Liste verwendet werden. Was meinst Du mit "0 definieren"?
Code: Alles auswählen
liste = [5, 7, 1, 9, 2, 4, 3]
for erster_index in range(len(liste)):
for zweiter_index in range(erster_index + 1, len(liste)):
if liste[erster_index] > liste[zweiter_index]:
liste[zweiter_index], liste[erster_index] = liste[erster_index], liste[zweiter_index]
print(liste)
Die ist ja nirgens definiert, daher mein unverständnis...