Seite 1 von 1

Ein Vergleich schlägt fehl

Verfasst: Mittwoch 15. Juni 2016, 12:50
von Brando
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?

Re: Ein Vergleich schlägt fehl

Verfasst: Mittwoch 15. Juni 2016, 13:28
von 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.

Re: Ein Vergleich schlägt fehl

Verfasst: Mittwoch 15. Juni 2016, 13:43
von Brando
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.

Re: Ein Vergleich schlägt fehl

Verfasst: Mittwoch 15. Juni 2016, 14:02
von 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.

Re: Ein Vergleich schlägt fehl

Verfasst: Mittwoch 15. Juni 2016, 14:14
von Sirius3
@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)

Re: Ein Vergleich schlägt fehl

Verfasst: Mittwoch 15. Juni 2016, 14:25
von Brando
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!

Re: Ein Vergleich schlägt fehl

Verfasst: Mittwoch 15. Juni 2016, 14:39
von Brando
Es wird der display Befehl mit dem HTML Code nicht ausgeführt. Woran liegt das?

Re: Ein Vergleich schlägt fehl

Verfasst: Mittwoch 15. Juni 2016, 16:09
von 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.