我试图创建一个问卷,每个答案都会引出一个不同的问题(类似于决策树或状态机所做的事情)。
使用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")发布于 2017-10-30 11:38:02
您可以为您的问题创建一个字典,以便将其与代码流分开处理,从而避免过多地使用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])发布于 2017-08-14 17:26:05
您可以使用嵌套的dictionary
surveyDict = {
"1" : {
"1" : {
"more_data" : {...}
}
},
"2" : {
}
}然后,您可以基本地跟踪最近的字典参加类似于这个伪代码。
currentDict = surveyDict
while currentDict:
answer = input("Whatever")
if answer in currentDict:
currentDict = currentDict[answer]
else:
break发布于 2017-08-14 17:34:19
你必须以某种方式指定问卷的结构,这可能会有些冗长,因为它必须包括所有的问题文本和所有的答案选择。但是,您可以做的是将应用程序逻辑的不同部分分开--特别是将问答定义与输入处理和输出打印分开,这可能会使您的代码看起来更简洁一些。
一种可能不错的方法是创建一个类来表示一个问题及其答案。类的一个实例将允许您根据所给出的答案检索下一个问题。就像这样:
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和其他表示和处理它们的方法,您可能更喜欢使用这些方法。
https://stackoverflow.com/questions/45679669
复制相似问题