现在我已经将我的头撞在墙上一段时间了,希望有人能够将我指向正确的方向
我正在编写一个Flask应用,并且我的查询返回以下词典列表(通过cur.fetchall)..
MyQueryResult = [{'gameID': 'game_1',
'prediction': 41,
'bonus': 'no',
'userName': 'Paul'},
{'gameID': 'game_2',
'prediction': 77,
'bonus': 'no',
'userName': 'Paul'},
{'gameID': 'game_1',
'prediction': 62,
'bonus': 'no',
'userName': 'Steve'},
{'gameID': 'game_2',
'prediction': 77,
'bonus': 'yes',
'userName': 'Steve'}
]
我需要将其转换为嵌套字典,以便我可以使用它构建带有jinja2模板的html表...该表将以'gameID'作为Y轴,以'userName'作为X轴,且预测为表中的值。在任何特定星期内可以有任意数量的游戏或用户
理想情况下,对我来说,要在jinja2中对其进行迭代,我需要将上面的“平”字典列表转换为以“ userName”和“ gameID” ..为键的嵌套字典,以便看起来像这样>
MyDict = {
'Paul': {
'game_1': {
'prediction': 'home_win', 'bonus': 'no'
},
'game_2': {
'prediction': 'away_win', 'bonus': 'no'
}},
'Steve': {
'game_1': {
'prediction': 'home_win', 'bonus': 'no'
},
'game_2': {
'prediction': 'away_win', 'bonus': 'yes'
}
}
}
这种格式将使我能够在Jinja2中按每个用户/每个游戏进行迭代,从而使我能够构建表
有人对我如何执行上述转换有任何想法吗...我已经尝试了很长时间,而且真的很难弄清楚:(
任何帮助将不胜感激
答案 0 :(得分:4)
更改字典格式的一种简单方法是对其进行迭代,并从头开始构建一个与所需格式匹配的新输出字典。遍历列表的最简单方法是For loop。为了简化一点,我们将利用Python集合库中的defaultdict
来创建输出字典。
我们现在需要的是一个循环遍历您的结果查询的循环。
from collections import defaultdict
output = defaultdict(dict)
for result in myQueryResult:
# Here we are just accessing all parameters to make the rest
# of the code less cluttered and more readable.
userName = result['userName']
gameID = result['gameID']
prediction = result['prediction']
bonus = result['bonus']
# Prepare our dictionary for each game.
tmp_game_dict = {'prediction': prediction, 'bonus': bonus}
# Add it to the output array. Note as we are using a defaultdict,
# we are not required to check if `userName` exists yet.
output[userName][gameID] = tmp_game_dict
您要查找的格式现在将存储在output
中。
请注意,在某些极端情况下,上述代码段无法捕获。例如,如果您收到同一gameID
的多个结果,则当前只会覆盖它。此外,它假设userName
,gameID
,prediction
和bonus
始终是结果数组的一部分-根据您的用例,您可能希望添加一些适当的错误处理。