嵌套字典理解(2级)

iyfjxgzm  于 2021-08-25  发布在  Java
关注(0)|答案(2)|浏览(275)

我有一个字典对象列表

data = [
    {
        'id': 1,
        'parent_id': 101 ,
        'name': 'A'        
    },
    {
        'id': 2,
        'parent_id': 101,
        'name': 'B'        
    },
    {
        'id': 3,
        'parent_id': 102,
        'name': 'C'        
    },
    {
        'id': 4,
        'parent_id': 102,
        'name': 'D'        
    }
]

我想把它转换成嵌套字典。
结构:

{
    parent_id_value: {
        name_value: id_value
    }
}

dictionary对象示例列表的结果应如下所示

{
    101: {
        'A': 1,
        'B': 2
    },
    102: {
        'C': 3,
        'D': 4
    }
}

我知道我们可以经营一家公司 for 循环和使用 setdefault 设置/获取 paren_id 值,然后将名称和id添加为键、值

new_dic = {}
for i in data:
    new_dic.setdefault(i['parent_id'], {})[i['name']] = i['id']
print(new_dic)

但我正在寻找一种更为通俗易懂的方法,也就是说,通过字典理解是否可能?

b4lqfgs4

b4lqfgs41#

首先,使用 operator.itemgetter 要提供密钥,请执行以下操作:

data.sort(key=itemgetter('parent_id'))

然后使用 itertools.groupby 要在嵌套的dict理解中对预期部分进行分组:

data = {
    key: {item['name']: item['id'] for item in group}
        for key, group in groupby(data, itemgetter('parent_id'))
}

我不建议写一行,但你可以用 sorted :

data = {
    key: {item['name']: item['id'] for item in group}
        for key, group in groupby(sorted(data, key=itemgetter('parent_id')), itemgetter('parent_id'))
}
pes8fvy9

pes8fvy92#

因此,你想玩理解游戏,你想看到一个专业的球员在它。
忘掉itertools,忘掉多个语句。这是一个最终的理解,它会让任何一个编写代码的程序员扔掉键盘,离开房间诅咒你。

data = {parent_id: {d["name"]: d["id"] for d in [i for i in data if i["parent_id"] == parent_id]} for parent_id in set((j["parent_id"] for j in data))}

但实际上,如果要与他人共享,请不要在代码中这样做。

相关问题