2014-01-12 3 views
0

Как я могу сделать оператор if/else, где if проверяет, является ли переменная 8-разрядная переменная двоичной? Я знаю, как сделать 8-значную часть (len()), но я не могу решить, как ограничить ее 1s и 0s.Python: проверка переменной в двоичном формате

+1

вы имеете в виду _string_ переменная содержит только нули и единицы, не так ли? Потому что «внутреннее представление» как единицы и нули задано ... – Floris

ответ

0

Является ли переменная кодируемой как строка или массив целых чисел? Вы можете просто просмотреть список, чтобы проверить каждый элемент, другие решения также возможны.

isBinary=[x==1 or x==2 for x in variable] 
isBinary=False in isBinary 
0

Вы могли бы попытаться разобрать их int при прохождении десятичную как это:

>>> x = int("10010", 2) 
>>> print x 
18 
2

Для подтверждения строка содержит ровно восемь единиц и нулей, проверить его для регулярного выражения

^[01]{8}$ 

Пример использования:

import re 
isBin = re.compile('^[01]{8}$') 
s1 = "00110101" 

if(s1.match(isBin)): 
    print "it is a match" 
else: 
    print "it is not a match" 
1

Вы можете использовать generator expression и all *:

if len(var) == 8 and all(x in "01" for x in var): 
    ... 

Ниже демонстрация:

>>> var = "01010101" 
>>> len(var) == 8 and all(x in "01" for x in var) 
True 
>>> var = "0101010" 
>>> len(var) == 8 and all(x in "01" for x in var) 
False 
>>> var = "01010102" 
>>> len(var) == 8 and all(x in "01" for x in var) 
False 
>>> 

* Примечание: Приведенный выше код предполагает, что var является строкой.

0

Вы можете использовать all() function для проверки каждого символа:

len(var) == 8 and all(c in '01' for c in var) 

или использовать set:

binary_digits = set('01') 
len(var) == 8 and binary_digits.issuperset(var) 

или использовать regular expression:

import re 

binary_digits = re.compile('^[01]{8}$') 
binary_digits.match(, var) is not None 

из этих трех вариантов, параметр регулярного выражения является самым быстрым, за которым следует набор:

>>> import re 
>>> import timeit 
>>> def use_all(v): return len(v) == 8 and all(c in '01' for c in v) 
... 
>>> def use_set(v, b=set('01')): return len(v) == 8 and b.issuperset(v) 
... 
>>> def use_re(v, b=re.compile('^[01]{8}$')): return b.match(v) is not None 
... 
>>> binary, nonbinary = '01010101', '01010108' 
>>> timeit.timeit('f(binary); f(nonbinary)', 'from __main__ import binary, nonbinary, use_all as f') 
4.871071815490723 
>>> timeit.timeit('f(binary); f(nonbinary)', 'from __main__ import binary, nonbinary, use_set as f') 
2.558954954147339 
>>> timeit.timeit('f(binary); f(nonbinary)', 'from __main__ import binary, nonbinary, use_re as f') 
2.036846160888672 
0

Я предполагаю, что вы также захотите преобразовать строку в целое число в какой-то момент. Если это не так, пожалуйста, исправьте меня.

В Python обычно считается, что лучше попытаться что-то сделать, и обработать сбой, если это произойдет; а не проверять, возможно ли что-то, и только потом делать это. Это называется принципом EAFP (проще просить прощения, чем разрешения).

В этом случае, вы должны использовать tryexcept:

s = '01100011' 
if len(s) == 8: 
    try: 
     n = int(s, 2) 
    except ValueError: 
     handle_exception_here() 
Смежные вопросы