缩短嵌套字典

时间:2019-03-05 21:34:40

标签: python dictionary

这个问题是这个问题的延续:Comprehension list and output <generator object.<locals>.<genexpr> at 0x000002C392688C78>

我的初衷是要提出一个新问题。 我在另一个词典中有几个词典。而且有时候它们会变得很大,因为我一直将它们保持在日志中,所以我想将它们的大小限制为30个“ items”(键:值)。

所以我尝试了这样的事情:(在示例中,我将大小限制为两个)

main_dict = {
    'A':{
        'a1': [1,2,3],
        'a2': [4,5,6]
        },
    'B': {
        'b1': [0,2,4],
        'b2': [1,3,5]
        }
    }

print([main_dict[x][i][:2] for x in main_dict.keys() for i in main_dict[x].keys()])

我得到的输出是这样:

[[1, 2], [4, 5], [0, 2], [1, 3]]

这是我的期望:

['A':['a1':[1, 2],'a2':[4, 5]], 'B':['b1':[0, 2], 'b2':[1, 3]]]

或者类似的东西。不一定是完全正确的,但是我需要知道什么值属于什么dict,在最终得到的输出中不清楚。

为了简单起见,我只想删掉字典中的子字典。优雅的,如果可能的话。

5 个答案:

答案 0 :(得分:1)

尝试一下:

print({key: {sub_key: lst[:2] for sub_key, lst in sub_dict.items()}
       for key, sub_dict in main_dict.items()})

请注意使用{}(字典理解)而不是[](列表理解)

答案 1 :(得分:1)

这是在不更改原始词典的情况下,一行就可以完成的一种好方法:

print({key: {sub_k: ls[:2] for sub_k, ls in sub_dict.items()} for key, sub_dict in main_dict.items()})
  

输出:

     

{'A': {'a1': [1, 2], 'a2': [4, 5]}, 'B': {'b1': [0, 2], 'b2': [1, 3]}}

您原来的审判使用列表理解[],但这种情况实际上需要字典理解{}

答案 2 :(得分:0)

一种更有效的方法是使用嵌套的for循环就地删除子列表的末尾:

for d in main_dict.values():
    for k in d:
        del d[k][2:]

main_dict变为:

{'A': {'a1': [1, 2], 'a2': [4, 5]}, 'B': {'b1': [0, 2], 'b2': [1, 3]}}

答案 3 :(得分:0)

d = {'A':{
         'a1': [1,2,3],
         'a2': [4,5,6],
         'a3': [7,8,9]
         },
     'B':{
         'b1': [0,2,4],
         'b2': [1,3,5]
         }
     }

如果词典仅嵌套 one-deep

q = []
for k,v in d.items():
   keys, values = v.keys(), v.values()
   values = (value[:2] for value in values)
   q.append((k,tuple(zip(keys,values))))

答案 4 :(得分:-2)

我已根据提供的注释重写了我的代码。见下文。

my_dict = {}

for key, value in main_dict.iteritems():
    sub_dict = {}
    for sub_key, sub_value in value.iteritems():
        sub_dict[sub_key] = sub_value[:2] 
    my_dict[key] = sub_dict

print my_dict

这将为您提供如下所示的内容,并将其保存到单独的变量中。

{'A': {'a1': [1, 2], 'a2': [4, 5]}, 'B': {'b1': [0, 2], 'b2': [1, 3]}}