如何正确将SQLite查询结果转换为dict适配Python答题应用?
问题:SQLite查询结果转换为指定Dict结构失败
我开发了一款答题应用,功能包括展示题目、在Listbox中呈现4个备选答案,点击按钮判断正误。目前从SQLite数据库查询到的数据为List类型,转换为Dict后结构与手动定义的不一致,出现顺序混乱、元素丢失的问题,需要调整转换逻辑使Dict结构符合预期。
问题根源
你当前的Convert函数逻辑错误:它将整个查询记录元组作为键值对配对,把第一条记录当作字典的键,第二条当作对应的值,完全不符合"题目为键、选项列表为值"的需求。
解决方案
直接遍历查询返回的每条记录,提取题目作为键,将后续的正确答案和三个选项组成列表作为对应值即可,无需复杂的迭代器操作。
修改后的完整代码
from tkinter import * import sqlite3 import random from string import ascii_lowercase SentenceFrame = Toplevel() # 连接数据库 conn = sqlite3.connect('Question_Bank.db') c = conn.cursor() # 查询数据 records = c.execute("SELECT Question, Correct_Answer, Option1 ,Option2 ,Option3 FROM Question_Bank").fetchall() # 关闭连接(查询操作无需commit) conn.close() # 正确的转换函数 def convert_to_question_dict(records): question_dict = {} for record in records: # 提取题目作为键,后续4个元素组成选项列表作为值 question = record[0] alternatives = list(record[1:]) question_dict[question] = alternatives return question_dict # 手动定义的参考结构 How_it_works = { "First US State?": [ "Delaware", "Ohio", "Texas", "Maryland" ], "Fastest car?": [ "Ferrari", "Mercedes", "BMW", "Tesla" ], } print("预期结构:") print(How_it_works) print(type(How_it_works)) print(len(How_it_works)) print("\n数据库返回的数据:") print(records) print(len(records)) print(type(records)) # 转换为目标字典 QUESTIONS = convert_to_question_dict(records) print("\n转换后的数据:") 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] # 随机打乱选项并分配字母标签(限制只取前4个字母,避免多余标签) labeled_alternatives = dict( zip(ascii_lowercase[:len(alternatives)], random.sample(alternatives, k=len(alternatives))) ) my_list = [labeled_alternatives] print("\n应用识别结果:") print(my_list) for k, v in labeled_alternatives.items(): my_listbox.insert(END, k + ": " + v)
运行结果验证
转换后的QUESTIONS结构将与手动定义的How_it_works完全一致:
转换后的数据: {'First US State?': ['Delaware', 'Ohio', 'Texas', 'Maryland'], 'Fastest car?': ['Ferrari', 'Mercedes', 'BMW', 'Tesla']} <class 'dict'> 2
应用识别结果也会正常显示选项,不会把题目混入选项列表:
应用识别结果: [{'a': 'Ohio', 'b': 'Delaware', 'c': 'Maryland', 'd': 'Texas'}]
内容的提问来源于stack exchange,提问作者Ed_Analyst
相关产品推荐
相关产品推荐

