Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/280.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 创建包含两个词典的嵌套词典_Python_Python 3.x_List_Dictionary_Nested - Fatal编程技术网

Python 创建包含两个词典的嵌套词典

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}

我有一个嵌套列表,名为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} , 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]})