将Dicts列表转换为2个深层嵌套Dict

时间:2019-08-23 17:27:25

标签: python dictionary

现在我已经将我的头撞在墙上一段时间了,希望有人能够将我指向正确的方向

我正在编写一个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中按每个用户/每个游戏进行迭代,从而使我能够构建表

有人对我如何执行上述转换有任何想法吗...我已经尝试了很长时间,而且真的很难弄清楚:(

任何帮助将不胜感激

1 个答案:

答案 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的多个结果,则当前只会覆盖它。此外,它假设userNamegameIDpredictionbonus始终是结果数组的一部分-根据您的用例,您可能希望添加一些适当的错误处理。