2017-08-14 2 views
0

回答がそれぞれ異なる質問につながるアンケートを作成しようとしています(デシジョンツリーやステートマシンと同様)。if文の過度の使用を避けるために動的な調査を行う方法は?

if-elseステートメントを使ってこれを行うのは簡単ですが、私は "ツリー"にもっと多くの枝と深さがあると思います。

ある時点で私はもうコードを読むことができません。

クリーンで読みやすい方法がありますか?ここで

は、私がこれまでに把握できるものの例です:あなたは、ネストされたdictionaryを使用することができ

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") 
+0

あなたはそれが現時点で何をするかの例を添付することはできますか?どのように見えるかは分かりやすいでしょう。 –

+0

はい。有向グラフやステートマシンについて学ぶことをお勧めします。そして、これをあなたの都合のよい形でグラフとして表現することができます。メインループは "現在の位置"変数と汎用ロジックで構成され、次の位置に移動します。 – Prune

答えて

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]) 
2

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

その後、basiclyのように出席するために、最後の辞書を追跡することができますこの疑似コード

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

アンケートの構造を何らかの方法で指定する必要があります。すべての質問テキストとすべての回答の選択肢を含める必要があるため、おそらく多少冗長になります。しかし、アプリケーションロジックのさまざまな部分を分離することができます。特に、質問と回答の定義を出力の入力と印刷の処理とは別にすることで、コードを少しきれいに見せることができます。

よくあるかもしれない1つの方法は、質問とその回答を表すクラスを作成することです。クラスのインスタンスは、答えが何であるかに応じて次の質問を取得することができます。

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や他の使い方を表現して処理する方法について、より多くの情報を読むことができます。

関連する問題