sqlite 如何正确查询“dict”类型?

nzrxty8p  于 2022-11-24  发布在  SQLite
关注(0)|答案(1)|浏览(124)

对于我的测验应用程序,我有一个模块,它会问问题,在列表框中显示4个可能的答案,然后单击一个按钮来获取结果并检查是否为真。
数据类型被错误地解释为列表,我将其转换为type:dict,但代码对它的解释与手动定义的不同。如何重新构造查询或转换函数,使dict类型正确?当前的解释会混淆顺序并删除一些元素:

from tkinter import *
from random import randint
import sqlite3
import random
from string import ascii_lowercase

SentenceFrame = Toplevel()

#Connect to a Database
conn=sqlite3.connect('Question_Bank.db')
c = conn.cursor()

records=[]

#Query into Table
records = c.execute("SELECT Question, Correct_Answer, Option1 ,Option2 ,Option3  FROM Question_Bank").fetchall()

#commit changes
conn.commit()

#close connection
conn.close()

How_it_works = {
"First US State?": [
    "Delaware",
    "Ohio", 
    "Texas", 
    "Maryland"
],
"Fastest car?": [
    "Ferrari", 
    "Mercedes", 
    "BMW", 
    "Tesla"
],
}

print(How_it_works)
print(type(How_it_works))
print((len(How_it_works)))

def Convert(a):
    it = iter(a)
    res_dct = dict(zip(it, it))
    return res_dct

print(records)
print(len(records))
print(type(records))

QUESTIONS=Convert(records)

print(QUESTIONS)
print(type(QUESTIONS))
print((len(QUESTIONS)))

my_listbox=Listbox(SentenceFrame)
my_listbox.grid(row=6, column=1)

QuestionLabel = Label(SentenceFrame, text="", font=("Helvetica", 20))
QuestionLabel.grid(row=3, column=1)

num_questions = len(QUESTIONS)
questions = random.sample(list(QUESTIONS.items()), k=num_questions)

num_correct = 0

for num, (question, alternatives) in enumerate(questions, start=1):
    QuestionLabel.config(text=question)
    correct_answer = alternatives[0]
    labeled_alternatives = dict(
        zip(ascii_lowercase, random.sample(alternatives, k=len(alternatives)))
    )

my_list=[labeled_alternatives]
print(my_list)
for k, v in labeled_alternatives.items():
    my_listbox.insert(END, k + ": " + v)

结果:

How_it_Works:
{'First US State?': ['Delaware', 'Ohio', 'Texas', 'Maryland'], 'Fastest car?': ['Ferrari', 'Mercedes', 'BMW', 'Tesla']}
<class 'dict'>
2

数据库如何返回数据:

[('First US State?', 'Delaware', 'Ohio', 'Texas', 'Maryland'), ('Fastest car?', 'Ferrari', 'Mercedes', 'BMW', 'Tesla')]
2
<class 'list'>

转换后的数据:

{('First US State?', 'Delaware', 'Ohio', 'Texas', 'Maryland'): ('Fastest car?', 'Ferrari', 'Mercedes', 'BMW', 'Tesla')} <class 'dict'> 1

应用程序如何解释:

[{'a': 'Ferrari', 'b': 'BMW', 'c': 'Fastest car?', 'd': 'Mercedes', 'e': 'Tesla'}]
5ktev3wc

5ktev3wc1#

我不太明白你现在在做什么。我建议这样:

questions = []
for r in records:
    questions.append({
        "question": r[0],
        "answer": r[1],
        "options": list(r[1:])
    })

for question in questions:
    correct_answer = question["answer"]
    print(question["question"])
    labelled = zip(ascii_lowercase, random.sample(question["options"], len(question["options"])))
    for label, option in labelled:
        print(label + ": " + option)

我用print替换了tkinter的内容,这样更容易使用,但是要把它改回来应该不会太难。它首先为每条记录创建一个字典,其中包含问题、答案和选项。然后我使用一个for循环来显示所有的问题。你可能会想用一个按钮或其他东西一次一个地显示它们。问题的标签和你以前做的很相似,但是我我把这些对进行了迭代,而不是编字典。

相关问题