2017-02-21 14 views
0

私はこの挑戦のアドバイスが必要です。要件は、入力が有効かどうか(つまり、0と1のみ、空白なし、文字なし)、受け入れられるか(2つの1を含むか)を確認することです。次に、入力が有効で受け入れられた場合は、バイナリを10進数に変換します。どんな助けもありがとう!入力がバイナリで、2つの1を含んでいるかどうかを確認してください

#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

私はループを私が欲しいものにすることはできません。最初のものは、すべてが無効であるとか、文字とバイナリに空白をつけることができます。 –

+0

私がしようとしているのは、リスト内の項目のいずれかが1または0でない場合、最初のループで有効な条件をfalseに変更します。 2回目のループでは、1の数が2に等しくない場合、受け入れられた条件をfalseに変更したい。 –

答えて

1

あなたは入力のみ0年代と1年代が含まれているかどうかをチェックするためにset Sを使用することができます。

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

結果が何であっても、サブセットは{'0', '1'}である必要があります。 (どちらか一方が存在しない可能性があります)set.issubset()メソッドを使用して確認することができます。 (第2の例では2に注意してください。)

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

最後に、あなたが見つけた、あなたは正確に2 1年代があるかどうかを把握するためにstr.count()を使用することができます。

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

ここにコードブロック全体があります。

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!") 

ステートメントの並べ替えに注意してください。最初に妥当性をチェックし、失敗点を特定しようとするのではなく、if/elifで個々の失敗事例を確認し、後で成功ケースをelseブロックに配置することができます。


編集:あなたがあなたのコード例で概説した戦略を使用して維持したい場合は、あなたが失敗した場合は、発見された後に検索を停止するために、最初のforループのifブロックにbreakを追加することができます。第2のforループは、characterをまったく使用していないので不要であり、削除することもできます(ifブロックを「外側」に保ちます)。 strイングスも同様に、反復処理と.count()方法を有することができるとしても

は、binary_listからbinaryからの変換が不要であることに注意します。

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

if var != 2: 
    accepted = False 
+0

フィードバックありがとうございます!私は両方の戦略を試して、彼らは挑戦を解決する。 –

関連する問題