2017-01-24 3 views
-4

Я вложенный словарь со списками как этогоВложенных словарь со списками многих словарей

{ 
    '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}, 
] 

Любая идея, как этого достичь?

+0

Куда девались 'x' и' c'? –

+0

x и c не нужны в результате – user7462430

ответ

0

Возможное решение:

#!/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 элемента, и этот элемент добавляется к comprehension вручную.

Остальные два элемента (b и z) взяты из массива x со списком.

Чтобы узнать больше о том, как постижения работы читают следующее:

PS. Вы должны сначала показать, что вы пробовали, и получить помощь по этому поводу. Взгляните на SO rules, прежде чем отправлять свой следующий вопрос.

0

Следующая производит требуемый результат:

[{'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)