You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何正确将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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 14:20:37