user3030327
user3030327

Reputation: 451

How to print OKAY if required variables are not empty?

a='1'
b='Apple'
c='Banana'

d='Some thing'
e=''
f=''
if (a and b and c !='') or (d and e and f !=''):
    print("OKAY")
else:
    print("Not OKAY")

As of my example code it is printing okay. But it should be print Okay either both d,e and f are should be empty or both should not to be empty. For example if a,b and c are not empty and d,e and f are empty then it should be print "okay". And a, b, c are not empty and d is not empty, e and f are empty so in this case it should print "not OKAY". Or if ab and c are not empty and d, e and f are also not empty then it should be print "OKAY". How to do. I don't have an practical idea that's why i could not given an example.

Truth Table: enter image description here

Upvotes: 0

Views: 233

Answers (2)

jda5
jda5

Reputation: 1446

def func(a, b, c, d, e, f):
    if all((a, b, c)):
        if not any((d, e, f)):
            return 'Okay'
    if all((d, e, f)):
        if not any((a, b, c)):
            return 'Okay'
    if all((a, b, c, d, e, f)):
        return 'Okay'
    return 'Not Okay'
  • any() returns True if any of a, b or c have text
  • all() returns True if all of a, b and c have text

-------- TESTS --------

a = 'text'
b = 'text'
c = ''
d = ''
e = ''
f = ''

>> Not Okay

a = 'text'
b = 'text'
c = 'text'
d = ''
e = ''
f = ''

>> Okay

a = 'text'
b = 'text'
c = 'text'
d = 'text'
e = 'text'
f = 'text' 

>> Okay

a = ''
b = ''
c = ''
d = 'text'
e = 'text'
f = 'text'

>> Okay

a = ''
b = ''
c = ''
d = ''
e = ''
f = ''

>> Not Okay

a = 'text'
b = 'text'
c = 'text'
d = 'text'
e = ''
f = ''

>> Not Okay

Upvotes: 1

deceze
deceze

Reputation: 522032

So your condition is that all items in a group need to be the same, empty or non-empty, and at least one of the two groups needs to be all non-empty. So you could say that each group has a ternary state: True (all non-empty), False (all empty) or None (mixed emptiness):

def group_state(*args):
    result = set(map(bool, args))
    if len(result) > 1:
        return None  # mixed truthiness
    return result.pop()  # one True or False value

Then you would have a comparison like:

if group_state(a, b, c) is not None and group_state(d, e, f) is not None \
        and (group_state(a, b, c) or group_state(d, e, f)):
    ...

Which we can write a little more elegantly as:

try:
    result = sum((group_state(a, b, c), group_state(d, e, f))) >= 1
except TypeError:
    result = False

if result:
    ...

We're taking advantage of the fact that True behaves as 1, False behaves as 0, and None cannot be summed up and results in a TypeError. So if either group results in None, it'll raise a TypeError and the end result is False. Otherwise, we'll want at least one group to be truthy, i.e. the sum needs to be at least 1.

Upvotes: 1

Related Questions