2017-03-19 1 views
2

Ich habe eine Funktion erstellt, die zwei Wörterbücher verwendet: curr_stats und weekly_result. Wenn es in weekly_result irgendwelche Schlüssel gibt, die nicht in curr_stats sind, soll die Funktion nur invalid_msg drucken, mit keiner Mutation von curr_stats.Bedingt, dass Tests für die Anwesenheit eines Wörterbuchschlüssels immer falsch sind

Aber die if Aussage in der 5. Zeile meines Codes scheint nicht zu funktionieren. Es soll die nächste if Anweisung auslösen, damit keine Mutation von curr_stats auftritt.

def update_standings(curr_stats, weekly_result): 
    invalid = 0 
    point_counter(weekly_result) 
    for team in weekly_result: 
     if team in curr_stats == False: 
      invalid = invalid + 1 
    if invalid > 0: 
     print(invalid_msg) 
    else: 
     for team in weekly_result: 
      curr_stats[team] = curr_stats[team] + weekly_result[team] 
+1

@ matteo-piano der ursprüngliche code ist gleich "team in curr_stats und curr_stats == False" und der zweite teil ist "False", siehe https://docs.python.org/2/reference/expressions.html#comparisons –

+0

@ PawełKordowski ohh ich sehe, gut danke danke –

Antwort

0

In Python, all comparisons have the same precedence, einschließlich in. Was passiert ist comparison chaining, eine spezielle Form bestimmt transitive Beziehungen wie in Mathematik Klasse zu testen:

if x_min < x < x_max: 
    ... 

Als Pawe & # x0142; Kordowski wies in his comment aus, die oben Vergleich Kette ist meist gleichbedeutend mit:

if x_min < x and x < x_max: 
    ... 

(Es gibt einen Unterschied. Der „gleichwertig“ Code x zweimal auswerten könnte, während die Vergleichskette x genau einmal auswertet)

In Ihrem Fall der Vergleich Kette:

if team in curr_stats == False: 
    ... 

... die (meist) entspricht:

if team in curr_stats and curr_stats == False: 
    ... 

Dies gilt allerdings nur, wenn curr_stats enthält teamundcurr_stats leer ist ... was nie passieren sollte.

Das Problem mit Ihrem Code ist die == False --- zum Teil, weil es einen Vergleich in eine Vergleichskette verwandelt hat, aber vor allem, weil Sie es nie in erster Linie gebraucht haben. Python liefert das Schlüsselwort not, wenn Sie ein Boolesches Gegenteil wollen. Ihre bedingte Anweisung sollte lauten:

if team not in curr_stats: 
    invalid = invalid + 1 

Ein letzter Vorschlag: Diese Funktion noch kürzer gemacht werden kann, indem der invalid Zähler loszuwerden und nur so schnell als eine ungültige team gefunden zurück. (Sobald die Sie entdeckt haben, dass weekly_result ist ungültige Eingabe, werden Sie wahrscheinlich egal, ob es „noch ungültig“.) habe ich auch dict.items die endgültige for Schleife zu vereinfachen:

def update_standings(curr_stats, weekly_result): 
    point_counter(weekly_result) 
    for team in weekly_result: 
     if team not in curr_stats: 
      print(invalid_msg) 
      return 
    for team, result in weekly_result.items(): 
     curr_stats[team] += result 
Verwandte Themen