Seite 1 von 1

Python: Befehl erfüllt Bedingung nicht ganz

Verfasst: Mittwoch 25. Oktober 2017, 13:10
von mnts
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

Re: Python: Befehl erfüllt Bedingung nicht ganz

Verfasst: Mittwoch 25. Oktober 2017, 13:19
von Liffi
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.

Re: Python: Befehl erfüllt Bedingung nicht ganz

Verfasst: Mittwoch 25. Oktober 2017, 13:21
von mnts
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)

Re: Python: Befehl erfüllt Bedingung nicht ganz

Verfasst: Mittwoch 25. Oktober 2017, 14:07
von __deets__
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]

Re: Python: Befehl erfüllt Bedingung nicht ganz

Verfasst: Mittwoch 25. Oktober 2017, 16:40
von Sirius3
@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)

Re: Python: Befehl erfüllt Bedingung nicht ganz

Verfasst: Donnerstag 26. Oktober 2017, 13:11
von mnts
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!!! :)