Python: Befehl erfüllt Bedingung nicht ganz

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
mnts
User
Beiträge: 4
Registriert: Mittwoch 27. September 2017, 12:35

Wir brauchen:
1. Ein Befehl, der Zahlen aus der 1. Variable in eine neuerstellte Variable einsteckt, und aus der 1. die Zahl löscht (ausschneiden)
2. Er soll alle Zahlen die maximal 3 Einheiten größer sind als die kleinste dort einfügen.
3. Wenn es keine passenden Zahlen mehr gibt, wiederholt er den Vorgang mit den verbleibenden Zahlen.


Wir haben jetzt das Problem, dass das (i) nur jede zweite Zahl bearbeitet.

Code: Alles auswählen

x = [2,5,7,9,3,5]
y = []
   while len(x) is not 0:
      minX = min(x)
   print(minX)
   for i in x:
     if i <= minX+3:
       y.append(i)
       x.remove(i)
     print(x)
   y.append(-1)
print(y)
Nun die Frage :?: :
Womit kann man (i) ersetzen oder wie soll man den code verändern?
Danke im vorraus
Liffi
User
Beiträge: 153
Registriert: Montag 1. Januar 2007, 17:23

Ich vermute mal, das ist eine Aufgabe für die Schule oder die Uni? Wobei der Schwierigkeitsgrad eher für die Schule passt.
Aber irgendwas ist mit der Formatierung passiert. Warum hast du eine größere Schriftart genommen?
Mir sist ist nicht klar, warum das while eingerückt ist.

Ansonsten hilft es, den Algorithmus einfach mal mit Zettel und Stift durchzugehen und zu schauen, wie die Zustände sind.
mnts
User
Beiträge: 4
Registriert: Mittwoch 27. September 2017, 12:35

Ohh sorry
Die Einrückungen habe ich in diesem Fall einfach irgendwie gemacht das ist nicht das Problem...
Wie gesagt, das Problem ist das (i)
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Ein Klassiker. Du itrierst über ein Sequenz, während du sie modifizierst. Das geht in die Hose. Denn der Iterator bekommt nicht mit, das sich was geändert hat, und zeigt jetzt eine Zahl weiter.

Ein Weg mit so etwas umzugehen besteht darin, Kopien von Datenstrukturen zu machen. Zb so on der Art:

Code: Alles auswählen

lower = [n for n in numbers if n <= zahl]
numbers = [n for n in numbers if n > zahl]
Sirius3
User
Beiträge: 18299
Registriert: Sonntag 21. Oktober 2012, 17:20

@mnts: falsche Einrückungen sind ein Problem, weil so der Code unlesbar ist. Du willst Hilfe, dann formulier das Problem so, dass es andere möglichst einfach verstehen. Zuerst zwei Dinge, die man sich gleich angewöhnen sollte, um nicht später mühsam umlernen zu müssen: eingerückt wird immer mit 4 Leerzeichen pro Ebene. Zahlen vergleicht man nie mit `is` sondern mit `==` bzw. `!=`. Hier kann man sogar noch einfacher prüfen, ob `x` den Wahrheitswert wahr besitzt, das ist nämlich dann der Fall, solange die Liste nicht leer ist.

Listen zu verändern ist in Python unüblich. Man macht sich einfach eine neue. Dann kommt es auch nicht zu Problemen, wenn man gleichzeitig über diese Liste iteriert.

Code: Alles auswählen

x = [2,5,7,9,3,5]
y = []
while x:
    min_x = min(x)
    print(min_x)
    new_x = []
    for value in x:
        if value <= min_x+3:
            y.append(value)
        else:
            new_x.append(value)
    x = new_x
    print(x)
print(y)
mnts
User
Beiträge: 4
Registriert: Mittwoch 27. September 2017, 12:35

Sirius3 hat geschrieben:@mnts: falsche Einrückungen sind ein Problem, weil so der Code unlesbar ist. Du willst Hilfe, dann formulier das Problem so, dass es andere möglichst einfach verstehen. Zuerst zwei Dinge, die man sich gleich angewöhnen sollte, um nicht später mühsam umlernen zu müssen: eingerückt wird immer mit 4 Leerzeichen pro Ebene. Zahlen vergleicht man nie mit `is` sondern mit `==` bzw. `!=`. Hier kann man sogar noch einfacher prüfen, ob `x` den Wahrheitswert wahr besitzt, das ist nämlich dann der Fall, solange die Liste nicht leer ist.

Listen zu verändern ist in Python unüblich. Man macht sich einfach eine neue. Dann kommt es auch nicht zu Problemen, wenn man gleichzeitig über diese Liste iteriert.

Code: Alles auswählen

x = [2,5,7,9,3,5]
y = []
while x:
    min_x = min(x)
    print(min_x)
    new_x = []
    for value in x:
        if value <= min_x+3:
            y.append(value)
        else:
            new_x.append(value)
    x = new_x
    print(x)
print(y)


Copyright!!! :)
Antworten