2017-02-21 5 views
0

Ich brauche einen Rat für diese Herausforderung. Die Anforderungen bestehen darin, zu sehen, ob die Eingabe gültig ist (d. H. Nur 0s und 1s, keine Leerzeichen und keine Buchstaben) und akzeptiert wird (enthält zwei 1s). Wenn die Eingabe gültig und akzeptiert ist, übersetzen Sie die Binärdatei in Dezimal. Jede Hilfe wäre willkommen!Überprüfen, ob Eingang binär ist und zwei 1s enthält

#Examples of invalid binary numbers: abc 10102011 10101FF 
#0000 1111 (note:contains a space) 
#Examples of valid, rejected binary numbers: 00000000 1111 01110000001 
#Examples of valid, accepted binary numbers: 1000001 11000000 1111 

binary = str(input("Enter a binary number: ")) 
binary_list = list(binary) 
valid = True 
accepted = True 
convert = "" 
var = binary_list.count('1') 

for character in binary_list: 
    if (character != '1') and (character != '0'): 
    valid = False 


for character in binary_list: 
    if (var != 2): 
    accepted = False 


if (valid == True and accepted == True): 
    print("Input", binary ,"is valid and accepted") 
    convert = int(binary, 2) 
    print ("The number is ", convert) 
elif (valid == False): 
    print ("Input was invalid") 
elif (valid == True and accepted == False): 
    print ("Input was rejected") 
+0

Ich kann nicht scheinen, um die for-Schleifen zu tun, was ich will. Der erste sagt alles ist ungültig oder lässt Zeichen und binär mit Leerzeichen durch. –

+0

Was ich versuche zu tun, ist die erste Schleife die Bedingung von gültig auf falsch ändern, wenn einige der Elemente in der Liste nicht 1s oder 0s sind. In der zweiten Schleife möchte ich, dass die Bedingung von akzeptiert zu false geändert wird, wenn die Anzahl von 1s nicht gleich 2 ist. –

Antwort

1

können Sie set s nur verwenden, wenn der Eingang 0 's und 1' s enthält zu überprüfen.

>>> set("1101101000100001001010101") 
{'0', '1'} 

Egal, was das Ergebnis ist, sollte es nur eine Teilmenge von {'0', '1'} enthalten. (Es besteht die Möglichkeit, dass es das eine oder das andere nicht gibt.) Wir können die Methode set.issubset() verwenden, um dies zu überprüfen. (Beachten Sie die 2 im zweiten Beispiel.)

>>> set("11010001").issubset(('0', '1')) 
True 
>>> set("11010201").issubset(('0', '1')) 
False 

Schließlich, wie Sie gefunden haben, können Sie str.count() verwenden, um herauszufinden, ob es genau zwei 1 ‚s.

>>> "1001".count('1') 
2 

Hier ist der gesamte Codeblock.

if not set(binary).issubset(('0', '1')): 
    print("Input was invalid binary.") 
elif binary.count('1') != 2: 
    print("Input was rejected.") 
else: 
    print("Input", binary, "was valid and accepted!") 

Beachten Sie die Neuordnung der Anweisungen; Anstatt zunächst die gesamte Gültigkeit zu prüfen und andernfalls Fehlerpunkte zu ermitteln, können wir einzelne Fehlerfälle mit if/elif s prüfen und anschließend den Erfolgsfall in den Block else setzen.


Edit: Wenn Sie die Strategie behalten mögen, die Sie in Ihrem Code Beispiel skizzierten, Sie break im if Block der ersten for Schleife hinzufügen kann, die Suche zu beenden, nachdem ein Fall nicht gefunden wurde. Die zweite for Schleife ist auch nicht notwendig, da Sie die character überhaupt nicht verwenden, und sie kann entfernt werden (den if Block "draußen" haltend).

Beachten Sie auch, dass die Umwandlung binary-binary_list unnötig ist, da str Ings über iteriert werden kann und haben die .count() Methode, wie gut.

for character in binary: 
    if character != '1' and character != '0': 
     valid = False 
     break 

if var != 2: 
    accepted = False 
+0

Vielen Dank für die Rückmeldung! Ich habe beide Strategien ausprobiert und sie lösen die Herausforderung. –

Verwandte Themen