Ein Vergleich schlägt fehl

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
Brando
User
Beiträge: 171
Registriert: Donnerstag 28. Januar 2016, 15:36

Folgender Code

Code: Alles auswählen

z=x[0]*x[1]
          gefunden=True
          
          for i in range(z.shape[1]):
             for j in range(z.shape[0]):
               if cb_container[i].children[j].value != str(z[i,j]):
                 gefunden=False
                 break
             if gefunden==False: 
                 break  
         
          if gefunden: 
              display(HTML("<b><font color='green'>Richtig</font></b>"))
          else:
              display(HTML("<b><font color='red'>Falsch</font></b>"))

Durch Testausgaben habe ich bestätigt, dass der Wert in cb_container.children[j] immer gleich dem Wert von z[i,j] ist. Aber der Code führt mich immer auf ein False für gefunden. Wie kommt das?
Zuletzt geändert von Anonymous am Mittwoch 15. Juni 2016, 13:20, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
BlackJack

@Brando: Das kommt daher das die Werte die da verglichen werden nicht gleich sind. Mindestens einer muss ungleich sein.

Die Namen sind verwirrend. `gefunden` impliziert irgendwie das da ein Element gesucht wird. Was aber tatsächlich passiert, ist das zwei Datenstrukturen miteinander verglichen werden. Das sollte alse `gleich` heissen. Ausserdem würde ich diesen Test in eine Funktion herausziehen, dann braucht man dafür gar keinen Namen und auch dieser zweifache ``break``-Stunt wird damit überflüssig. Zudem würde man das in Python ohne `i` und `j` mit der `zip()`-Funktion ausdrücken. Eventuell wird das dann auch kompakt genug um `all()` und einen Generatorausdruck verwenden zu können.
Brando
User
Beiträge: 171
Registriert: Donnerstag 28. Januar 2016, 15:36

Die Verbesserungsvorschläge in Ehre, abe rdazu brauche ich Zeit. Momentan will ich meine Lösung zum Laufen bringen. Der Hinweis, dass irgendeine Ungleichheit zwischen cb_container.children[j].value und str(z[i,j]) auftritt in Ehren, aber er ist doch nicht stichhaltig, weil ich, wie ich schon darauf hingewiesen habe, durch Kontrollausdrücke festgestellt habe dass cb_container.children[j].value und str(z[i,j]) gleich sind. Nur in dem Vergleich, den der Code vornimmt wird eine Ungleichheit festgestellt. Habe schon alles versucht, insbesondere mit strip() habe ich gearbeitet, aber es funktioniert nicht. Es ist wie verhext.
BlackJack

@Brando: Wenn Du dazu Zeit brauchst, dann nimm Dir die Zeit.

Und natürlich ist das stichhaltig das es mindestens ein ungleiches Element gibt, denn wäre dem nicht so, dann würde sich das ja so verhalten wie Du erwartest.

Was liefert denn das `value`-Attribut von so einer `Checkbox` und ein Array-Element jeweils als Wert? Lass Dir das doch einfach mal *in der Schleife* ausgeben ob Deine Annahmen stimmen. Wie gesagt, sie *können nicht* stimmen.
Sirius3
User
Beiträge: 18335
Registriert: Sonntag 21. Oktober 2012, 17:20

@Brando: statt hier immer wieder Behauptungen aufzustellen, die aus Deinem Gefühl heraus stimmen müssten, aber der Computer einfach nicht wahrhaben will, solltest Du anfangen, Deine Behauptungen nachzuprüfen, indem Du z.B. die Vergleiche per print ausgibst:

Code: Alles auswählen

          for i in range(z.shape[1]):
             for j in range(z.shape[0]):
               a = cb_container[i].children[j].value
               b = str(z[i,j])
               print "%r == %r -> %s" % (a, b, a == b)
Brando
User
Beiträge: 171
Registriert: Donnerstag 28. Januar 2016, 15:36

Hallo Sirius,

habe jetzt durch Testausdrücke bestätigt, dass die Routine richtig läuft. Aber obwohl ich für gefunden den Wert True bekomme wird doch in folgendem Code immer die False Variante angezeigt.

Code: Alles auswählen

if gefunden==True: 
              display(HTML("<b><font color='green'>Richtig</font></b>"))
else:
              display(HTML("<b><font color='red'>Falsch</font></b>"))

Das ist doch mehr als seltsam!
Brando
User
Beiträge: 171
Registriert: Donnerstag 28. Januar 2016, 15:36

Es wird der display Befehl mit dem HTML Code nicht ausgeführt. Woran liegt das?
BlackJack

@Brando: Einer von den beiden muss ja ausgeführt werden. Es sei denn davor löst irgendetwas eine Ausnahme aus, so dass das ``if`` gar nicht ausgeführt wird.
Antworten