如何在Python中切换字典字典的嵌套结构

时间:2017-04-13 11:55:38

标签: python dictionary nested

如果我有以下字典:

dict_a = {'a': {'x': 0, 'y': 1, 'z': 2},
          'b': {'x': 3, 'y': 4, 'z': 5}}

将字典结构切换为以下内容的最佳方法是:

dict_b = {'x': {'a': 0, 'b': 3},
          'y': {'a': 1, 'b': 4},
          'z': {'a': 2, 'b': 5}}

2 个答案:

答案 0 :(得分:4)

使用默认字典

鉴于字典总是两层深,您可以使用defaultdict

执行此操作
from collections import defaultdict

dict_b = defaultdict(dict)

for k,v in dict_a.items():
    for k2,v2 in v.items():
        dict_b[k2][k] = v2

给出了:

>>> dict_b
defaultdict(<class 'dict'>, {'x': {'a': 0, 'b': 3}, 'z': {'a': 2, 'b': 5}, 'y': {'a': 1, 'b': 4}})
>>> dict(dict_b)
{'x': {'a': 0, 'b': 3}, 'z': {'a': 2, 'b': 5}, 'y': {'a': 1, 'b': 4}}

defaultdictdict的子类,您可以使用dict在香草dict_b = dict(dict_b)中再次转换结果(如第二个查询中所示)。

使用pandas

您也可以使用pandas

from pandas import DataFrame

dict_b = DataFrame(dict_a).transpose().to_dict()

这给出了:

>>> DataFrame(dict_a).transpose().to_dict()
{'y': {'a': 1, 'b': 4}, 'x': {'a': 0, 'b': 3}, 'z': {'a': 2, 'b': 5}}

答案 1 :(得分:0)

如果我们使用setdefault,则不需要$users = User::select(\DB::raw('strftime("%m", created_at) as month, count(id) as total')) ->whereBetween('created_at', ['2020-01-01 00:00:00', '2020-12-31 23:59:59']) ->groupBy('month') ->orderBy('month') ->pluck('total', 'month') ->all(); 来转置嵌套的字典:

defaultdict