Более простой способ проверить, есть ли еще операторы 3 переменных с 7 операторами

#python #if-statement #logic

Вопрос:

Есть ли простой способ проверить 2 переменные с 3 условиями или 3 переменные с 7 условиями и так далее?

 def checkXYZ():
    if x==1 and y==0 and z==0:
        doX()
    elif x==0 and y==1 and z==0:
        doY()
    elif x==0 and y==0 and z==1:
        doZ()

    elif x==1 and y==1 and z==0:
        doXY()
    elif x==0 and y==1 and z==1:
        doYZ()
    elif x==1 and y==0 and z==1:
        doXZ()

    elif x==1 and y==1 and z==1:
        doXYZ()
 

Ответ №1:

Это конкретный ответ на вопрос, но вы можете реализовать checkXYZ() функцию, как показано ниже:

 def checkXYZ():
    if x==1:
        print("x", end='')
    if y==1:
        print('y', end='')
    if z==1:
        print('z', end='')
    print()  # new line

x = 1
y = 0
z = 1
checkXYZ()
 

xz

end параметр, заданный print() функции, указывает последний символ в конце строки. По умолчанию, end='n' , но вы можете установить его '' равным, чтобы не вводить новые строки.

Альтернативное решение, вдохновленное @Sujay и @Yu-Sheng Li

 a = b = y = z = 1
c = x = 0
variables = [a,b,c,x,y,z]
strs = "abcxyz"
print(''.join(s for var, s in zip(variables, strs) if var))
 

abyz

Для реализации методов:

 
def doA():
    pass
def doB():
    pass
def doC():
    pass
def doAB():
    pass
def doAC():
    print("AC")
def doBC():
    pass
def doABC():
    pass
    
dict_ = {'a' : doA, 'b': doB, 'c': doC, 'ab': doAB, 'ac': doAC, 'bc': doBC, 'abc': doABC}
variables = [a,b,c]
strs = "abc"
b = 0
a = c = 1
dict_[''.join(s for var, s in zip(variables, strs) if var)]()
 

пт

Комментарии:

1. что делать, если это не оператор печати, а для вызова другой функции?

2. @Mehteva Я просто спросил из любопытства, потому что, если бы было больше переменных, то у нас должно было бы быть больше операторов if, и я проверял, есть ли способ сократить его (например, 4 переменные, будет 15 операторов).

3. Я добавил один способ сделать это, вы можете поместить функции в dict .

4. Я думаю, что это не работает, так как doAC() уже напечатал и не вернул ни одного при создании dict_ . Вам нужно dict_ = {'a': doA, ...} и в конце концов dict_[...]()

5. Вы правы, исправлено. Спасибо вам за исправление.

Ответ №2:

ОТРЕДАКТИРОВАНО: для запуска методов (хотя exec это не рекомендуется)

 def check_vars(variables, strs, prefix="do"):
    method = prefix   "".join(s for var, s in zip(variables, strs) if var)
    exec(f"{method}()")

# in your case
check_vars([x, y, z], "XYZ")
 

Общее решение:

 def check_vars(variables, strs):
    ans = ""
    for var, s in zip(variables, strs):
        if var:
            ans  = s
    print(ans)

# in your case
check_vars([x, y, z], "xyz")
 

Комментарии:

1. что делать, если это не оператор печати, а для вызова другой функции?

2. Это можно сократить как ''.join(s for var, s in zip(vars, strs) if var) . Сцепление строк происходит медленнее, чем приведенное выше

3. @Sujay Приятно, я тоже об этом думал

4. @свазиленд В этом случае, я думаю, вам нужно передать другое отображение dict из (1, 1, 0) в doXY, например.

5. @свазиленд обновлен, без необходимости предоставления сопоставления, но имеет предположение об именах методов