Generic way to create nested dictionary from flat list in python

后端 未结 3 1299
暗喜
暗喜 2021-01-18 04:48

I am looking for the simplest generic way to convert this python list:

x = [
        {\"foo\":\"A\", \"bar\":\"R\", \"baz\":\"X\"},
                 


        
3条回答
  •  长发绾君心
    2021-01-18 05:39

    #!/usr/bin/env python3
    from itertools import groupby
    from pprint import pprint
    
    x = [
            {"foo":"A", "bar":"R", "baz":"X"},
            {"foo":"A", "bar":"R", "baz":"Y"},
            {"foo":"B", "bar":"S", "baz":"X"},
            {"foo":"A", "bar":"S", "baz":"Y"},
            {"foo":"C", "bar":"R", "baz":"Y"},
        ]
    
    
    def fun(x, l):
        ks = ['foo', 'bar', 'baz']
        kn = ks[l]
        kk = lambda i:i[kn]
        for k,g in groupby(sorted(x, key=kk), key=kk):
            kg = [dict((k,v) for k,v in i.items() if k!=kn) for i in g]
            d = {}
            d[kn] = k
            if l

    [{'bars': [{'bar': 'R', 'bazs': [{'baz': 'X'}, {'baz': 'Y'}]},
               {'bar': 'S', 'bazs': [{'baz': 'Y'}]}],
      'foo': 'A'},
     {'bars': [{'bar': 'S', 'bazs': [{'baz': 'X'}]}], 'foo': 'B'},
     {'bars': [{'bar': 'R', 'bazs': [{'baz': 'Y'}]}], 'foo': 'C'}]
    

    note: dict is unordered! but it's the same as yours.

提交回复
热议问题