首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Quiz应用程序错误:生成10个随机问题的函数有时会生成9或11个问题

Quiz应用程序错误:生成10个随机问题的函数有时会生成9或11个问题
EN

Stack Overflow用户
提问于 2019-04-16 14:27:23
回答 1查看 108关注 0票数 0

我正在使用flask在pythonanywhere上编写一个测验应用程序。这是我第一次在任何地方使用flask或learning,所以我还在学习中。下面的函数抛出了一个奇怪的错误,有时它会生成11或9个字典条目,而不是10个,即使Qnum参数从不更改。

我认为这个问题可能与别名有关(因为该函数删除了一个条目),所以我尝试通过遍历字典键和值来创建单独的列表。当我直接在我的主应用程序文件中编写代码时,它工作得很好,但一旦我将它抽象为一个助手函数,它就开始发挥作用。

从Helper函数文件:

代码语言:javascript
复制
  def create_answer_dict(Dict, Qnum):
        import random
        Qdict={}
        for i in range(Qnum):
            #Choose random word to test
            Qkeys=[]
            for key in Dict.keys():
                Qkeys.append(key)
            Qword=random.choice(Qkeys)

            #Get correct answer from dictionary
            correctAnswer = Dict[Qword]

            #Generate wrong answer options
            wrongAnswers=[]
            for value in Dict.values():
                wrongAnswers.append(value)
            del wrongAnswers[wrongAnswers.index(correctAnswer)]
            wrongAnswers = random.sample(wrongAnswers, 3)
            answerOptions = wrongAnswers + [correctAnswer]
            random.shuffle(answerOptions)
            Qdict[Qword]=answerOptions
        return Qdict

在主应用程序文件中:

代码语言:javascript
复制
@app.route("/", methods=["GET","POST"])
def index():
    Qdict=create_answer_dict(questions, total)
    if request.method == "GET":
        return render_template('main.html', q = Qdict, keys=Qdict.keys())
    elif request.method == 'POST':
        score=0
        for i in Qdict.keys():
            answered=request.form[i]
            if original_questions[i]==answered:
                score+=1
    return render_template("results.html", score=score, total=total)

在html视图中:

代码语言:javascript
复制
<form action='/' method='POST'>
    <ol>
        {% for i in keys %}
            <li>What is the French for <u>{{i}}</u> ?  </li>
            {% for j in q[i] %}
                <input type='radio' value='{{j}}' name='{{i}}'      style="margin-right: 5"/>{{j}}
                <br></br>
            {% endfor %}
        {% endfor %}
    </ol>
    <input type="submit" value="submit" />
</form>

它是如何工作的:

可能的问题和答案存储在字典对象中。

在我的主应用程序文件中,我使用问答字典和变量total作为参数,从助手函数文件调用此函数。总数设置为10。

该函数选择Qnum个问题,找到对应的答案,并随机选择3个错误答案。

它以字典的形式返回这些内容,格式如下:

代码语言:javascript
复制
{Question1:[CorrectAnswer, IncorrectAnswer1,IncorrectAnswer2, IncorrectAnswer3],
Question2:[CorrectAnswer, IncorrectAnswer1,IncorrectAnswer2, IncorrectAnswer3], 
etc.}

一切返回时都不会引发错误,只是有时字典中的条目比预期的少了一个或多了一个。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-04-16 15:32:26

您不能期望通过从另一个字典中随机挑选n条目来获得长度为n的字典,因为始终存在挑选重复条目的可能性(并且由于字典键是唯一的,因此在生成的字典中将覆盖重复条目)。

在字典中选择固定数量的随机键n的一种更好的方法是,简单地从字典键创建一个列表,对该列表进行混洗,然后对该列表进行切片,以仅保留第一个n元素。

在您的代码中,它将如下所示:

代码语言:javascript
复制
def create_answer_dict(Dict, Qnum):
    import random
    Qdict={}

    possibleQuestions = list(Dict.keys())
    random.shuffle(possibleQuestions)
    possibleQuestions = possibleQuestions[:Qnum]

    for Qword in possibleQuestions:
        #Get correct answer from dictionary
        correctAnswer = Dict[Qword]

        #Generate wrong answer options
        wrongAnswers = list(Dict.values())
        del wrongAnswers[wrongAnswers.index(correctAnswer)]
        wrongAnswers = random.sample(wrongAnswers, 3)
        answerOptions = wrongAnswers + [correctAnswer]
        random.shuffle(answerOptions)
        Qdict[Qword] = answerOptions
    return Qdict

这将保证生成Qnum唯一的问题。

编辑:另外,在index()中,如果用户没有回答所有问题,为了避免KeyErrors,请替换

代码语言:javascript
复制
for i in Qdict.keys():
        answered=request.form[i]
        ...

使用

代码语言:javascript
复制
for i in request.form:
        answered=request.form[i]
        ...

工作演示:https://repl.it/@glhr/55701832

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55701832

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档