簡體   English   中英

包含多個字典列表的嵌套字典

[英]Nested dictionary with lists to many dictionaries

我有這樣的列表嵌套字典

    {
     'a': 1,
     'x':[
          {'b': 1,
           'c': [
             {'z': 12},
             {'z': 22},
            ]
          },
          {'b': 2,
           'c': [
              {'z': 10},
              {'z': 33},
            ]
          }
        ]
     }

我想將它轉換為我這樣形成的平面詞典列表。

[
 {'a': 1, 'b': 1, 'z': 12},
 {'a': 1, 'b': 1, 'z': 22},
 {'a': 1, 'b': 2, 'z': 10},
 {'a': 1, 'b': 2, 'z': 33},
]

知道如何實現這一目標嗎?

一個可能的解決方案是:

#!/usr/bin/env python3
d = {
    'a': 1,
    'x': [
        {
            'b': 1,
            'c': [
                {'z': 12}
            ]
        },
        {
            'b': 2,
            'c': [
                {'z': 10}
            ]
        }
    ]
}

res = [{"a": 1, "b": x["b"], "z": x["c"][0]["z"]} for x in d["x"]]
print(res)

這假設只有一個a (固定值為1 )和x元素,並且這個元素被手動添加到理解中

其他兩個元素( bz )從帶有列表推導式的x數組中獲取。

要了解有關理解如何工作的更多信息,請閱讀以下內容:

附注。 您應該首先展示到目前為止您嘗試過的內容並獲得幫助。 在發布下一個問題之前,請查看SO 規則

以下生成請求的結果:

[{'a': 1, 'b': 1, 'z': 12}, {'a': 1, 'b': 2, 'z': 10}]

使用風險自負。 以下僅在您的示例上進行了測試。

from itertools import product

def flatten(D):

    if not isinstance(D, dict): return D

    base = [(k, v) for k, v in D.items() if not isinstance(v, list)]
    lists = [[flatten(x) for x in v] for k, v in D.items() if isinstance(v, list)]

    l = []
    for p in product(*lists):
        r = dict(base)
        for a in p:
            for d in a:
                r.update(d)
        l.append(r)

    return l

以上測試如下。

d = {
     'a': 1,
     'x':[
          {'b': 1,
           'c': [
             {'z': 12}
            ]
          },
          {'b': 2,
           'c': [
              {'z': 10}
            ]
          }
        ]
     }

print flatten(d)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM