Все ответы пользователя, взятые вместе, могут использоваться для формирования уникального двоичного числа (одно состоит только из нулей и единиц). Вы можете составить таблицу (список) для каждого условия, проиндексированного каждой из возможных комбинаций ответа в каждой позиции, для хранения значения, которое данное условие - выраженное как лямбда-функция - будет иметь для этого набора.
После того, как эти таблицы настроены, вы можете определить, выполняется ли какое-либо условие, посмотрев значение в соответствующей таблице, проиндексированное с помощью данной комбинации ответов. Ниже приведен пример того, как это можно настроить.
NUM_ANSWERS = 4
NUM_COMBOS = 2**NUM_ANSWERS
NO,YES = 'no','yes'
def index(answers):
""" Convert a list of yes/no answers into binary number. """
binstr = ''.join([('1' if a is 'yes' else '0') for a in answers])
return int(binstr, 2)
def answers(index):
""" Convert binary value of number into list of yes/no answers. """
masks = [2**p for p in range(NUM_ANSWERS-1, -1, -1)]
bits = [((index & m) / m) for m in masks]
return [[NO,YES][b] for b in bits]
# condition expressions
cond_expr1 = lambda a1,a2,a3,a4: a1 is YES and a2 is NO # a3,a4 ignored
cond_expr2 = lambda a1,a2,a3,a4: (
( a1 is YES and a2 is NO ) or ( a3 is YES and a4 is NO )
)
# build tables for each condition
cond1 = []
cond2 = []
for i in range(NUM_COMBOS):
ans_combo = answers(i)
cond1.append( cond_expr1(*ans_combo) )
cond2.append( cond_expr2(*ans_combo) )
# once tables are built, you can lookup the corresponding conditional
print cond1[ index(['yes', 'no', 'no', 'yes']) ] # True
print cond2[ index(['yes', 'no', 'yes', 'no']) ] # True