基于字典键进行分组

时间:2017-05-29 15:19:44

标签: python dictionary hash

我有一个字典如下:

    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'
    }
}

3 个答案:

答案 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'}})

使用标准dicts

如果没有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'}}