我有一个字典如下:
dict_details = {
'device.dummy.1.id': '1',
'device.dummy.2.id': '2',
'device.dummy.1.length': '202',
'device.dummy.2.length': '203',
'device.dummy.2.validity': '10001',
'device.dummy.1.validity': '10002',
'device.dummy.1.type': 'first',
'device.dummy.2.type': 'first'
}
我需要用上面的字典创建一个跟随字典。这是字典值的组合,带有一些唯一的标识符,它将存在于我的字典中。
{
'device.dummy.1': {
'id': '1',
'length': '202',
'validity': '10001',
'type': 'first'
},
'device.dummy.2': {
'id': '2',
'length': '203',
'validity': '10002',
'type': 'first'
}
}
我尝试了以下代码:
dict_details = {
'device.dummy.1.id': '1',
'device.dummy.2.id': '2',
'device.dummy.1.length': '202',
'device.dummy.2.length': '203',
'device.dummy.2.validity': '10001',
'device.dummy.1.validity': '10002',
'device.dummy.1.type': 'first',
'device.dummy.2.type': 'first'
}
s = {}
dummy = {}
for key, value in dict_details.items():
attrib = key.rsplit(".",1)[1]
macro = key.rsplit(".",1)[0]
s[attrib] = value
dummy[macro] = s
print(dummy)
但它正在生成如下输出,这是被现有密钥覆盖的密钥值。
寻找相同的一些简单的解决方法。
{
'device.dummy.1': {
'length': '202',
'type': 'first',
'id': '1',
'validity': '10001'
},
'device.dummy.2': {
'length': '202',
'type': 'first',
'id': '1',
'validity': '10001'
}
}
答案 0 :(得分:3)
defaultdict
您可以使用defaultdict
:
from collections import defaultdict
dict_details = {
'device.dummy.1.id': '1',
'device.dummy.2.id': '2',
'device.dummy.1.length': '202',
'device.dummy.2.length': '203',
'device.dummy.2.validity': '10001',
'device.dummy.1.validity': '10002',
'device.dummy.1.type': 'first',
'device.dummy.2.type': 'first'
}
new_dict = defaultdict(dict)
for key in dict_details:
a, b = key.rsplit(".", 1)
new_dict[a][b] = dict_details[key]
print(new_dict)
# defaultdict(<type 'dict'>, {'device.dummy.1': {'length': '202', 'type': 'first', 'id': '1', 'validity': '10002'}, 'device.dummy.2': {'length': '203', 'type': 'first', 'id': '2', 'validity': '10001'}})
如果没有defaultdict
,您只需要在添加属性之前检查是否定义了子目录:
dict_details = {
'device.dummy.1.id': '1',
'device.dummy.2.id': '2',
'device.dummy.1.length': '202',
'device.dummy.2.length': '203',
'device.dummy.2.validity': '10001',
'device.dummy.1.validity': '10002',
'device.dummy.1.type': 'first',
'device.dummy.2.type': 'first'
}
dummy = {}
for key, value in dict_details.items():
attrib, macro = key.rsplit(".",1)
if not dummy.get(attrib):
dummy[attrib] = {}
dummy[attrib][macro] = value
print(dummy)
# {'device.dummy.1': {'length': '202', 'type': 'first', 'id': '1', 'validity': '10002'}, 'device.dummy.2': {'length': '203', 'type': 'first', 'id': '2', 'validity': '10001'}}
答案 1 :(得分:1)
这是因为你正在重复使用s。您可能想要做更像
的事情dummy.setdefault(macro, {})[attrib] = value
如果还没有虚拟[宏],则将虚拟[宏]设置为空字典。
答案 2 :(得分:0)
import pprint
dict_details = {
'device.dummy.1.id': '1',
'device.dummy.2.id': '2',
'device.dummy.1.length': '202',
'device.dummy.2.length': '203',
'device.dummy.2.validity': '10001',
'device.dummy.1.validity': '10002',
'device.dummy.1.type': 'first',
'device.dummy.2.type': 'first'
}
dummy = {}
for key, value in dict_details.items():
attrib = key.rsplit(".",1)[1]
macro = key.rsplit(".",1)[0]
if macro not in dummy:
dummy[macro]={}
dummy[macro][attrib]=value
else:
dummy[macro][attrib]=value
pprint.pprint(dummy)
<强> RESULT 强>
{'device.dummy.1': {'id': '1',
'length': '202',
'type': 'first',
'validity': '10002'},
'device.dummy.2': {'id': '2',
'length': '203',
'type': 'first',
'validity': '10001'}}