1

New Python learner here. I've looked all over for assistance but I can't seem to find a solution to my problem. I want to create a dictionary from user input, but for some of the variables, I would like to include if/then or while statements in order to skip questions that are irrelevant based on the user input. Here is an example of my code so far:

    input_dict = {'var1': input('Question 1:\n'),
                  'var2': input('Question 2:\n'),
                  'var3': input('Question 3:\n'),
                  'var4': input('Question 4:\n')}

What I'd like to do is create a loop where if the answer to Question 3 is 'no', then it would skip question 4.

I also realize that I may be approaching this problem incorrectly. The end goal is to create a dataframe of information from the user input.

1
  • Did any of the answers below help you solve this problem? If so, please accept the better answer by clicking the checkmark near the top of it. Commented Jul 14, 2023 at 23:46

3 Answers 3

2

You can create a for-loop and break if question number is 3 and answer is "no":

input_dict = {}
for question in range(1, 5):
    ans = input("Question {}:".format(question))
    input_dict["var{}".format(question)] = ans
    if question == 3 and ans == "no":
        break

print(input_dict)

Prints:

Question 1:yes
Question 2:yes
Question 3:no
{'var1': 'yes', 'var2': 'yes', 'var3': 'no'}
Sign up to request clarification or add additional context in comments.

Comments

0

This should be a simple example, assuming you are storing questions in plain text. We loop over sorted keys.

input_dict = {'var1': 'Question 1:',
              'var2': 'Question 2:',
              'var3': 'Question 3:',
              'var4': 'Question 4:'}

out_dict = {}

for q in sorted(input_dict.keys()):
    ans = input(input_dict[q])
    out_dict[q] = ans
    if ans == "no":
        break

Question 1:yes
Question 2:yes
Question 3:no
>>> out_dict
{'var1': 'yes', 'var2': 'yes', 'var3': 'no'}

Comments

0

The most expedient way is to perhaps hardcode these interactions (see @Andrej's answer for a good example of this).

However, following along with your somewhat "procedural"/configurable dictionary approach (e.g. something you could later read in from a file, etc.), that is easily tunable you just need a simple data structure which would capture the dependencies between different questions, maybe even with a default to use if a question is skipped. Then you could simply ask that data structure w/in your for/while loop whether to skip a given question if a previous question makes it irrelevant.

This would also allow you to skip a question but still go on to the next question

Something like:

data_definition = [
    {
        "key_name": "var1",
        "prompt": "Question 1:\n",
        "dependencies": None,
        "default_val": None,
    },
    {
        "key_name": "var2",
        "prompt": "Question 2:\n",
        "dependencies": None,
        "default_val": None,
    },
    {
        "key_name": "var3",
        "prompt": "Question 3:\n",
        "dependencies": None,
        "default_val": None,
    },
    {
        "key_name": "var4",
        "prompt": "Question 4:\n",
        "dependencies": {"var3": "no"},
        "default_val": None,
    },
]

input_dict = {}

for question in data_definition:
    # if any (could change this to all if you like) of the dependencies are satisfied, skip the question
    skip = False
    for dep, skip_answer in (question["dependencies"] or {}).items():
        if dep in input_dict and input_dict[dep] == skip_answer:
            input_dict[question["key_name"]] = question["default_val"]
            skip = True
            break
    if skip:
        continue

    input_dict[question["key_name"]] = input(question["prompt"])

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.