python中从平面列表创建嵌套字典的通用方法

2024-04-26 21:18:42 发布

您现在位置:Python中文网/ 问答频道 /正文

我在寻找最简单的通用的方法来转换这个python列表:

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"},
    ]

进入:

^{pr2}$

组合“foo”、“bar”、“baz”是唯一的,正如您所见,列表不一定按此键排序。在


Tags: 方法列表foo排序barbazpr2
3条回答
#!/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<len(ks)-1:
            d[ks[l+1]+'s'] = list(fun(kg, l+1))
        yield d

pprint(list(fun(x, 0)))

^{pr2}$

注意:dict是无序的!但和你的一样。在

我将定义一个函数来执行一个单独的分组步骤,如下所示:

from itertools import groupby
def group(items, key, subs_name):
    return [{
        key: g,
        subs_name: [dict((k, v) for k, v in s.iteritems() if k != key)
            for s in sub]
    } for g, sub in groupby(sorted(items, key=lambda item: item[key]),
        lambda item: item[key])]

然后去做

^{pr2}$

它给出foos所需的结果。在

这是一个简单的数据循环,没有递归。在生成结果树时,使用一个辅助树(其中的值是字典键)作为结果树的索引。在

def make_tree(diclist, keylist):
    indexroot = {}
    root = {}
    for d in diclist:
        walk = indexroot
        parent = root
        for k in keylist:
            walk = walk.setdefault(d[k], {})
            node = walk.setdefault('node', {})
            if not node:
                node[k] = d[k]
                parent.setdefault(k+'s',[]).append(node)
            walk = walk.setdefault('children', {})
            parent = node
    return root[keylist[0]+'s']

foos = make_tree(x, ["foo","bar","baz"])

相关问题 更多 >