2016-04-01 11 views
1

ich versuche, damit der Benutzer den Wert für ein Wörterbuch ändern, mein Wörterbuch ist d wie folgt:Wörterbuch true/false Fehler

d = {'gary:' : 'B','john:': 'C',} 

Immer, wenn ich gebe ‚Gary:‘ (Gary mit einem Semikolon) für den nameedit Eingang, der warum Variable führt immer zu wahr, aber unabhängig, wird der Wert als keine gelesen und nie den zweiten Eingang für den Buchstaben Grad (inpu)

nameedit = str(input("Which student do you wish to edit the grade of?")) 
    why = print(nameedit in d) 
    if why == None: 
     print("That student doesn't exist") 
    else: 
     inpu = str(input("Enter new letter grade: A,B,C,D,F,")) 
     d[nameedit] = inpu 
     print(d)   

ich habe auch versucht, einige Variationen erreichen Auf diesem wie wenn nameedit == True: und ein sonst mit dem gleichen Problem, die print-Anweisung wird True b ergeben Aber es wird einfach weiter zur else-Anweisung gehen. Ich versuchte auch ein elif nameedit in d:

why = print(nameedit in d) 
    if nameedit in d == True: 
     inpu = str(input("Enter new letter grade: A,B,C,D,F,")) 
     d[nameedit] = inpu 
     print(d)    
    else: 
     print("That student doesn't exist") 

, aber ohne Erfolg. Ist es unmöglich, den Wert zu lesen, den die print-Anweisung liest? Mein Ziel ist es, einfach zu überprüfen, ob der Name im Wörterbuch enthalten ist, wenn es weiterhin, wenn es nicht, stoppen ist

Python v 3.5

+4

'print' retrurns' None'. Tun Sie stattdessen 'why = nameedit in d'. –

+0

yea ich versuchte das vorher, aber es resultiert der gleiche Fehler, die Druckanweisung ist nur dort, um in True zu resultieren, um mir zu helfen, zu bestätigen, dass nameedit einem Wörterbuchschlüssel gleich ist, was es tut, es wird wahr (mindestens für mich) – piiiiiiiiiiiii

+0

FYI, Py3s "Eingabe" gibt bereits 'str' zurück; Das Umbrechen in 'str' ist überflüssig. – ShadowRanger

Antwort

0

Verwendung:

why = nameedit in d 
if why: 
    inpu = str(input("Enter new letter grade: A,B,C,D,F,")) 
    d[nameedit] = inpu 
    print(d)  
else: 
    print('Does not exists') 
+4

Sie sollten erklären, was sie falsch gemacht haben, damit sie verstehen, welche Fehler sie gemacht haben. – idjaw

+0

Verwenden Sie 'd.keys()' nicht für den Mitgliedschaftstest. 'dict'-Mitgliedsprüfung testet direkt auf das Vorhandensein eines Schlüssels, also ist' nameedit in d' das gleiche logische Ergebnis, und es ist schneller zu booten (vermeidet die geringen Kosten für die Konstruktion der keysview in Py3 und die hohen Herstellungskosten eine flache Kopie der Schlüssel als "Liste", dann linear in Py2 scannen). – ShadowRanger

+0

vielen dank! dachte nicht, nur warum, versuchte zu verwenden, wenn warum = wahr und wenn warum = keine und so viele Variationen, aber das macht viel mehr Sinn! – piiiiiiiiiiiii

0

nameedit in d kehren True oder False, niemals None. Und das Wrapping in print (das immer None zurückgibt) ist nur unsinnig.

Entfernen Sie die print Umhüllen und den Test zu if not why: ändern oder einfach nur den Test in den Zustand bewegen sich:

nameedit = input("Which student do you wish to edit the grade of?") 
if nameedit not in d: 
    print("That student doesn't exist") 
else: 
    d[nameedit] = input("Enter new letter grade: A,B,C,D,F,") 
    print(d) 

ich unnötige str Verpackung entfernt (input bereits wieder str in PY3) und unnötige Zwischen Einheimischen .

+0

Entschuldigung wegen dieser Änderung. Ich dachte, ich würde meinen eigenen Beitrag bearbeiten. – zondo

+0

@zondo: Ja, ich war etwas verwirrt, da ich einen ähnlichen Schnitt machte, als sich der Post plötzlich änderte. :-) – ShadowRanger

0

print() bringt nur die Ausgabe auf den Bildschirm; es gibt nicht zurück, was es druckt. Wenn Sie why dem Ergebnis nameedit in dund zuweisen möchten, drucken Sie es; tun Sie es in separaten Zeilen:

why = nameedit in d 
print(why) 

Auch if ... zu sehen, wenn ...True ist. Using if ... == True wird sehen, wenn ... == True == True. Das ist überflüssig. Genau dies tun:

why = nameedit in d 
print(why) 
if why: 
    inpu = input("Enter new letter grade: A,B,C,D,F,") 
    d[nameedit] = inpu 
    print(d)    
else: 
    print("That student doesn't exist") 

Ich entfernte auch Ihre Umwandlung von input(...) in einen String. Es gibt bereits eine Zeichenfolge zurück, daher ist die Konvertierung redundant.

0

Verwenden gerade wie:

if why in d: 

oder

if why not in d: 

Sie nicht verwenden zwei Strings dafür brauchen. Auch können Sie Wert erhalten mit erhalten:

d = {'gary:' : 'B','john:': 'C',} 

name = str(input("Which student do you wish to edit the grade of?\n")) 

value = d.get(name, None) 

if not value: 
    print("That student doesn't exist: {0}: [1}".format(name, value)) 
else: 
    value = str(input("Enter new letter grade: A,B,C,D,F \n")) 
    d[name] = value.upper() 
    print(d) 
+0

Dein Test ist rückwärts; Wenn der Schüler eine Note hat, sagt er, dass der Schüler nicht existiert. Außerdem ist '.get's zweites Argument implizit' None' (also muss man es nicht übergeben), und es gibt Probleme bei der Verwendung von 'if value:' (und sogar dem korrekteren 'if not value:'), weil Wenn das "dict" falsche Werte enthalten könnte, verhält es sich so, als ob der Schlüssel nicht existiert. Auch ein bisschen seltsam, den "Wert" zu drucken, wenn man glaubt, dass der Wert nicht existiert ... – ShadowRanger

+0

@ShadowRanger, ja, du hast Recht! Vielen Dank – JRazor

Verwandte Themen