将字典列表转换为 2 个深度的嵌套字典

国泰

我已经用这个头撞墙有一段时间了,所以希望有人能够指出我正确的方向

我正在编写一个烧瓶应用程序,我的查询返回以下字典列表(通过 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 中基于每个用户/每个游戏进行迭代,从而使我能够构建一个表

有没有人知道我如何执行上述转换......我已经尝试了很长时间并且真的很难弄清楚:(

任何帮助将不胜感激

m_____z

更改字典格式的一种简单方法是对其进行迭代并从头开始构建与所需格式匹配的新输出字典。迭代列表的最简单方法是For 循环为了让它更简单一点,我们将利用defaultdictPython 集合库来创建我们的输出字典。

我们现在需要的只是一个循环来遍历您的结果查询。

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,predictionbonus始终是结果数组的一部分 - 根据您的用例,您可能想要添加一些适当的错误处理。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章