如何进行动态调查,避免过度使用if语句?

时间:2017-08-14 17:16:57

标签: python

我试图创建一个调查问卷,其中每个答案都会导致一个不同的问题(类似于决策树或状态机所做的那样)。

使用if-else语句完成此操作很简单,但我期望在我的"树"中有更多的分支和深度。

我害怕在某些时候我不能再阅读这段代码了。

有没有更清晰,易读的方式来写这个?

这是我到目前为止所能找到的一个例子:

DT<- data.frame(string=c("A","B","C","D","E","F","A","C",
              "F","Z","A"), stringsAsFactors=FALSE)

3 个答案:

答案 0 :(得分:2)

您可以使用嵌套的dictionary

surveyDict = {
    "1" : {
        "1" : {
            "more_data" : {...}
        }
    },
    "2" : {
    }
}

然后,您可以基本上跟踪上一个要参加的词典,如伪代码

currentDict = surveyDict
while currentDict:
    answer = input("Whatever")
    if answer in currentDict:
        currentDict = currentDict[answer]
    else:
        break

答案 1 :(得分:2)

你将不得不以某种方式指定调查问卷的结构,这可能会有点冗长,因为它必须包括所有问题文本和所有答案选择。但是你可以做的是将应用程序逻辑的不同部分分开 - 特别是将问题和答案定义与输出和打印输出的处理分开,这可能会使你的代码看起来更清晰。

可能是体面的一种方法是创建一个表示问题及其答案的类。该类的实例将允许您根据给出的答案检索下一个问题。像这样:

class Question:
    def __init__(self, question, answers):
        # question is a string, answers is a list of N strings
    def set_next(self, answer_choice, next_question):
        # answer_choice is an index from 0 to N-1 and
        # next_question is the Question object that should be used
        # next if that answer is chosen
    def ask(self):
        # this prints self.question and the answers using raw_input()
        # and returns the Question object (if any) that was set with
        # set_next() which corresponds to what the user typed

然后,您可以将问题转换为此对象的实例:

Q1 = Question('What is up?', ['Down', 'Left', 'Right'])
Q11 = Question('something about down?', ['A', 'B'])
Q1.set_next(0, Q11)
# etc.

您可以使用简单的循环继续提问:

question = Q1
while question is not None:
    question = question.ask()

有各种方法可以让它更优雅,但这会让你开始。请注意,您在此处所做的是制作问题对象的有向无环图(DAG)。如果您进行网络搜索,您可以阅读有关DAG以及其他表示和处理您可能更喜欢使用它们的方法的更多信息。

答案 2 :(得分:0)

您可以为您的问题创建一个字典,以便将其与代码流分开处理,从而避免过度使用if语句以使其更具可读性。

以下是使用此解决方案的示例:

questions = {"0": "Q1 \n\n1)\n\n2)\n\n3)\n",
             "1": "Q1.1 \n\n1)\n\n2)\n\n",
             "2": "Q1.2 \n\n1)\n\n2)\n\n3)\n\n",
             "3": "Q1.3 \n\n1)\n\n2)\n\n3)\n\n4)\n\n",
             "11": "Q1.1.1 \n\n1)\n\n2)\n\n3)\n\n",
             "12": "Q1.1.2 \n\n1)\n\n2)\n\n3)\n\n",
             "21": "Q1.2.1 \n\n1)\n\n2)\n\n",
             "22": "Q1.2.2 \n\n1)\n\n2)\n\n",
             "23": "Q1.2.3 \n\n1)\n\n2)\n\n3)\n\n",
             "31": "Q1.3.1 \n\n1)\n\n2)\n\n",
             "32": "Q1.3.2 \n\n1)\n\n2)\n\n",
             "33": "Q1.3.3 \n\n1)\n\n2)\n\n",
             "34": "Q1.3.4 \n\n1)\n\n2)\n\n"}

q1 = raw_input(questions["0"])
q2 = raw_input(questions[r1])
q3 = raw_input(questions[r1+r2])