Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何进行动态调查以避免过度使用if语句?_Python - Fatal编程技术网

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

Python 如何进行动态调查以避免过度使用if语句?,python,Python,我试图创建一个问卷,每个答案都会引出一个不同的问题(类似于决策树或状态机所做的) 使用if-else语句来实现这一点非常简单,但我希望我的“树”有更多的分支和深度 我担心在某个时候我将无法再阅读代码了 有没有一种更干净、易读的方法来写这篇文章 下面是一个到目前为止我能理解的例子: q1 = raw_input("Q1 \n\n1)\n\n2)\n\n3)\n") if q1 == "1": q2 = raw_input("Q1.1 \n\n1)\n\n2)\n\n") if q2 =

我试图创建一个问卷,每个答案都会引出一个不同的问题(类似于决策树或状态机所做的)

使用if-else语句来实现这一点非常简单,但我希望我的“树”有更多的分支和深度

我担心在某个时候我将无法再阅读代码了

有没有一种更干净、易读的方法来写这篇文章

下面是一个到目前为止我能理解的例子:

q1 = raw_input("Q1 \n\n1)\n\n2)\n\n3)\n")
if q1 == "1":
   q2 = raw_input("Q1.1 \n\n1)\n\n2)\n\n")
   if q2 == "1":
      q3 = raw_input("Q1.1.1 \n\n1)\n\n2)\n\n3)\n\n")
   if q2 == "2":
      q3 = raw_input("Q1.1.2 \n\n1)\n\n2)\n\n3)\n\n")
if q1 == "2":
   q2 = raw_input("Q1.2 \n\n1)\n\n2)\n\n3)\n\n")
   if q2 == "1":
      q3 = raw_input("Q1.2.1 \n\n1)\n\n2)\n\n")
   if q2 == "2":
      q3 = raw_input("Q1.2.2 \n\n1)\n\n2)\n\n")
   if q2 == "3":
      q3 = raw_input("Q1.2.3 \n\n1)\n\n2)\n\n3)\n\n")
if q1 == "3":
   q2 = raw_input("Q1.3 \n\n1)\n\n2)\n\n3)\n\n4)\n\n")
   if q2 == "1":
      q3 = raw_input("Q1.3.1 \n\n1)\n\n2)\n\n")
   if q2 == "2":
      q3 = raw_input("Q1.3.2 \n\n1)\n\n2)\n\n")
   if q2 == "3":
      q3 = raw_input("Q1.3.3 \n\n1)\n\n2)\n\n")
   if q2 == "4":
      q3 = raw_input("Q1.3.4 \n\n1)\n\n2)\n\n")

您可以使用嵌套的
词典

surveyDict = {
    "1" : {
        "1" : {
            "more_data" : {...}
        }
    },
    "2" : {
    }
}
然后,您可以基本上跟踪最后一个要参加的词典,如下面的伪代码所示:

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

您可以使用嵌套的
词典

surveyDict = {
    "1" : {
        "1" : {
            "more_data" : {...}
        }
    },
    "2" : {
    }
}
然后,您可以基本上跟踪最后一个要参加的词典,如下面的伪代码所示:

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

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

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

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以及其他表示和处理DAG的方法,您可能更喜欢使用这些方法。

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

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

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)。如果您进行web搜索,您可以阅读更多关于DAG和其他表示和处理它们的方法的信息,您可能更喜欢使用这些方法。

您可以为您的问题创建一个字典,将其与代码流分开处理,从而避免过度使用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])

您可以为您的问题创建一个字典,将其与代码流分开处理,从而避免过度使用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])

你能举一个例子说明它目前的作用吗?看看它是什么样子会很有用的。是的。我建议您学习有向图和状态机。然后你就可以用某种形式的图形来表示它了;主循环将由一个“当前位置”变量和通用逻辑组成,用于将您带到下一个位置。您能附上一个示例说明它目前的功能吗?看看它是什么样子会很有用的。是的。我建议您学习有向图和状态机。然后你就可以用某种形式的图形来表示它了;主循环将由一个“当前位置”变量和通用逻辑组成,以使您到达下一个位置。