Python 创建包含两个词典的嵌套词典
我有一个嵌套列表,名为multi:Python 创建包含两个词典的嵌套词典,python,python-3.x,list,dictionary,nested,Python,Python 3.x,List,Dictionary,Nested,我有一个嵌套列表,名为multi: [[14, 77766 ,[2, 2]], [15, 77766, [1, 2]], [70, 88866, [1, 5]], [71, 88866,[2, 5]], [72, 88866, [5, 5]], [73, 88866, [4, 5]], [74, 88866, [3, 5]], [79, 99966, [1, 2]], [80, 99966, [2, 2]]] 我需要我的输出为: {77766: {14:2 ,15:1}
[[14, 77766 ,[2, 2]],
[15, 77766, [1, 2]],
[70, 88866, [1, 5]],
[71, 88866,[2, 5]],
[72, 88866, [5, 5]],
[73, 88866, [4, 5]],
[74, 88866, [3, 5]],
[79, 99966, [1, 2]],
[80, 99966, [2, 2]]]
我需要我的输出为:
{77766: {14:2 ,15:1} , 88866: {70:1, 71:2, 72:5, 73:4, 74:3}, 99966: {79:1, 80:2}}
我编写了以下两本词典的代码。如何将它们结合起来以实现我想要的输出
a = {77766: [14, 15], 88866: [70, 71, 72, 73, 74], 99966: [79, 80]}
1.合并你的字典
a={77766:[14,15],88866:[70,71,72,73,74],99966:[79,80]}
b={14:2,15:1,70:1,71:2,72:5,73:4,74:3,79:1,80:2}
c={
k:{
i:b[i]
因为我在v
}
对于a.项()中的k,v
}
印刷品(c)
输出:
{77766:{14:2,15:1},88866:{70:1,71:2,72:5,73:4,74:3},99966:{79:1,80:2}
2.直接从原始词典在处构建结果词典
数据=[
[14, 77766, [2, 2]],
[15, 77766, [1, 2]],
[70, 88866, [1, 5]],
[71, 88866, [2, 5]],
[72, 88866, [5, 5]],
[73, 88866, [4, 5]],
[74, 88866, [3, 5]],
[79, 99966, [1, 2]],
[80, 99966, [2, 2]],
]
c={}
对于数据中的键、id、(值、):
c、 setdefault(id_,{})[key]=value
印刷品(c)
输出:与上面相同假设您的输入列表按第二列排序,您可以使用
itertools.groupby
:
import itertools
multi = [
[14, 77766, [2, 2]],
[15, 77766, [1, 2]],
[70, 88866, [1, 5]],
[71, 88866, [2, 5]],
[72, 88866, [5, 5]],
[73, 88866, [4, 5]],
[74, 88866, [3, 5]],
[79, 99966, [1, 2]],
[80, 99966, [2, 2]],
]
nested = {
key: {l[0]: l[2][0] for l in lines}
for key, lines in itertools.groupby(multi, lambda p: p[1])
}
输出
{77766: {14: 2, 15: 1},
88866: {70: 1, 71: 2, 72: 5, 73: 4, 74: 3},
99966: {79: 1, 80: 2}}
您可以在此处使用
defaultdict
<代码>多个不需要排序
from collections import defaultdict
out=defaultdict(dict)
for v,k,vs in multi:
out[k]={**out[k],**{v:vs[0]}}
输出
defaultdict(dict,
{77766: {14: 2, 15: 1},
88866: {70: 1, 71: 2, 72: 5, 73: 4, 74: 3},
99966: {79: 1, 80: 2}})
编辑:
对内部词典进行排序
out={k:dict(sorted(v.items(),key=lambda x:x[1])) for k,v in out.items()}
输出:
{77766: {15: 1, 14: 2},
88866: {70: 1, 71: 2, 74: 3, 73: 4, 72: 5},
99966: {79: 1, 80: 2}}
对于这个问题,defauldict(dict)非常方便。 通过传入dict可以将空字典定义为默认值。这意味着:如果您试图访问一个尚不存在的密钥,则会为此密钥创建一个空字典
res = defaultdict(dict)
for inner_key, key, inner_value in multi:
res[key].update({inner_key: inner_value[0]})
请注意,您收到的是defaultdict而不是常规字典。如果您的用例需要后者,您可以使用:
res = {}
for inner_key, key, inner_value in multi:
if key not in res:
res[key] = {}
res[key].update({inner_key: inner_value[0]})
非常感谢你!是否有任何可以按值对嵌套字典进行排序的方法?例如:{77766:{15:114:2}、88866:{70:1、71:2、74:3、73:4、72:5}、99966:{79:1、80:2}非常感谢!是否有任何可以按值对嵌套字典进行排序的方法?例如:{77766:{15:1114:2},88866:{70:1,71:2,74:3,73:4,72:5},99966:{79:1,80:2}}已经做了:)快速问题,有没有我可以按值对嵌套字典排序的方法?例如:{77766:{15:114:2},88866:{70:1,71:2,74:3,73:4,72:5},99966:{79:1,80:2}不起作用,代码中的
映射应该在哪里?
res = {}
for inner_key, key, inner_value in multi:
if key not in res:
res[key] = {}
res[key].update({inner_key: inner_value[0]})