这个问题是这个问题的延续: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,在最终得到的输出中不清楚。
为了简单起见,我只想删掉字典中的子字典。优雅的,如果可能的话。
答案 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]}}