首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在字典列表中使用相同的键创建嵌套字典?

问如何在字典列表中使用相同的键创建嵌套字典?
EN

Stack Overflow用户
提问于 2022-11-08 12:04:19
回答 3查看 33关注 0票数 1

我有一本字典:

代码语言:javascript
复制
data=[{'first': '0', 'last': 'hg01', 'pay': 0},
 {'first': '0', 'last': 'hg75', 'pay': 15},
 {'first': '0', 'last': 'hg0', 'pay': 1},
 {'first': '0', 'last': 'hg9', 'pay': 13},
 {'first': '0', 'last': 'hg0', 'pay': 0},
 {'first': '0', 'last': 'hg', 'pay': 13},
 {'first': '0', 'last': 'hg76', 'pay': 0},
 {'first': '0', 'last': 'hg1', 'pay': 9},
 {'first': '0', 'last': 'hg81', 'pay': 13},
 {'first': '0', 'last': 'hg12', 'pay': 1},
 {'first': '0', 'last': 'hg03', 'pay': 15},
 {'first': '0', 'last': 'hg11', 'pay': 9},
 {'first': '0', 'last': 'hg1', 'pay': 1}]

我想把字典或列表理解转换成这本词典:

代码语言:javascript
复制
output={0: {'hg76':{'first': '0'},'hg0':{'first': '0'},'hg01':{'first': '0'}},
        15: {'hg75':{'first': '0'},'hg03':{'first': '0'}},
        1: {'hg1':{'first': '0'},'hg12':{'first': '0'},'hg0':{'first': '0'}},
        13: {'hg81':{'first': '0'},'hg':{'first': '0'},'hg9':{'first': '0'}},
        9: {'hg1':{'first': '0'},'hg11':{'first': '0'}}}

我对这个问题没有任何想法

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2022-11-08 12:12:50

这可以通过嵌套理解来完成,而不需要任何包:

代码语言:javascript
复制
data=[{'first': '0', 'last': 'hg01', 'pay': 0},
 {'first': '0', 'last': 'hg75', 'pay': 15},
 {'first': '0', 'last': 'hg0', 'pay': 1},
 {'first': '0', 'last': 'hg9', 'pay': 13},
 {'first': '0', 'last': 'hg0', 'pay': 0},
 {'first': '0', 'last': 'hg', 'pay': 13},
 {'first': '0', 'last': 'hg76', 'pay': 0},
 {'first': '0', 'last': 'hg1', 'pay': 9},
 {'first': '0', 'last': 'hg81', 'pay': 13},
 {'first': '0', 'last': 'hg12', 'pay': 1},
 {'first': '0', 'last': 'hg03', 'pay': 15},
 {'first': '0', 'last': 'hg11', 'pay': 9},
 {'first': '0', 'last': 'hg1', 'pay': 1}]

unique_pay_vals = {d['pay'] for d in data}
new_dict = {p: {d['last']: {'first': d['first']} for d in data if d['pay'] == p} 
            for p in unique_pay_vals}

print(new_dict)
# {0: {'hg01': {'first': '0'}, 'hg0': {'first': '0'}, 'hg76': {'first': '0'}}}
# {1: {'hg0': {'first': '0'}, 'hg12': {'first': '0'}, 'hg1': {'first': '0'}}}
# {9: {'hg1': {'first': '0'}, 'hg11': {'first': '0'}}}
# {13: {'hg9': {'first': '0'}, 'hg': {'first': '0'}, 'hg81': {'first': '0'}}}
# {15: {'hg75': {'first': '0'}, 'hg03': {'first': '0'}}}
票数 2
EN

Stack Overflow用户

发布于 2022-11-08 12:09:57

试试itertools.groupby和dict comprehension

代码语言:javascript
复制
from itertools import groupby
{k:{v1['last']: {'first': v1['first']} for v1 in v} for k,v in groupby(sorted(data, key=lambda x: x["pay"]), key=lambda x: x["pay"])}

#output
{0: {'hg01': {'first': '0'}, 'hg0': {'first': '0'}, 'hg76': {'first': '0'}},
 1: {'hg0': {'first': '0'}, 'hg12': {'first': '0'}, 'hg1': {'first': '0'}},
 9: {'hg1': {'first': '0'}, 'hg11': {'first': '0'}},
 13: {'hg9': {'first': '0'}, 'hg': {'first': '0'}, 'hg81': {'first': '0'}},
 15: {'hg75': {'first': '0'}, 'hg03': {'first': '0'}}}
票数 2
EN

Stack Overflow用户

发布于 2022-11-08 12:13:53

我会在这里使用dict.setdefault:

代码语言:javascript
复制
out = {}
for d in data:
    out.setdefault(d['pay'], {})[d['last']] = {'first': d['first']}

产出:

代码语言:javascript
复制
{0: {'hg01': {'first': '0'}, 'hg0': {'first': '0'}, 'hg76': {'first': '0'}},
 15: {'hg75': {'first': '0'}, 'hg03': {'first': '0'}},
 1: {'hg0': {'first': '0'}, 'hg12': {'first': '0'}, 'hg1': {'first': '0'}},
 13: {'hg9': {'first': '0'}, 'hg': {'first': '0'}, 'hg81': {'first': '0'}},
 9: {'hg1': {'first': '0'}, 'hg11': {'first': '0'}}}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74360439

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档