Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Validating the value of several variables

Tags:

python

What I am after: The user is allowed to input only 0 or 1 (for a total of 4 variables). If the user inputs for example 2, 1, 1, 0 it should throw an error saying Only 0 and 1 allowed.

What I've tried so far:

if (firstBinary != 0 or firstBinary != 1 and secondBinary != 0
      or secondBinary != 1 and thirdBinary != 0 or thirdBinary != 1
      and forthBinary != 0 or forthBinary != 1):
    print('Only 0 and 1 allowed')
else:
    print('binary to base 10: result)

Problem: When I use such a statement, I get either the result even when I input for example 5, or I get 'only 0 and 1 allowed' even though I wrote all 1 or 0.


I found this which seemed to be what I was after, but it is still not working like I want it to:

if 0 in {firstBinary, secondBinary, thirdBinary, forthBinary} or 1 in \
    {firstBinary, secondBinary, thirdBinary, forthBinary}:
    print("Your result for binary to Base 10: ", allBinaries)
else:
    print('Only 0 and 1 allowed')

This code basically gives me the same result as what I get with the first code sample.

like image 846
SunnBro Avatar asked Dec 28 '25 00:12

SunnBro


2 Answers

Use any:

v1, v2, v3, v4 = 0, 1, 1, 2

if any(x not in [0, 1] for x in [v1, v2, v3, v4]):
    print "bad"

of course, if you use a list it will look even better

inputs = [1, 1, 0 , 2]

if any(x not in [0, 1] for x in inputs):
    print "bad"
like image 100
perreal Avatar answered Dec 30 '25 14:12

perreal


This is due to the operator precedence in python. The or operator is of higher precedence than the and operator, the list looks like this:

  1. or
  2. and
  3. not
  4. !=, ==

(Source: https://docs.python.org/3/reference/expressions.html#operator-precedence)

So, python interprets your expression like this (the brackets are to clarify what is going on):

if (firstBinary != 0 or (firstBinary != 1 and secondBinary != 0 or (secondBinary != 1 and \
thirdBinary != 0 or (thirdBinary != 1 and forthBinary != 0 or (forthBinary != 1)))))

Which results in a different logic than what you want. There are 2 possible solutions to this, the first one is to add brackets to make the expression unambiguous. This is quite tedious and long-winded:

if ((firstBinary != 0 or firstBinary != 1) and (secondBinary != 0 or secondBinary != 1) and \
(thirdBinary != 0 or thirdBinary != 1) and (forthBinary != 0 or forthBinary != 1))

The other approach is to use the in-built all function:

vars = [firstBinary, secondBinary, thirdBinary, fourthBinary]
if not all(0 <= x <= 1 for x in vars):
    print("Only 0 or 1 allowed")
like image 38
Dartmouth Avatar answered Dec 30 '25 15:12

Dartmouth



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!