按公共密钥

时间:2018-03-08 19:49:22

标签: python dictionary

我正在尝试根据键合并列表中的词典列表。相同的示例输入如下:

my_data = {
    "id_1": [
        {"er": {"ip": "myhost", "port": 80}},
        {"ef": {"ip": "myhost", "port": 80}},
        {"er": {"app": "falsk", "port1": 81}},
        {"ef": {"app": "django", "port1": 85}}
    ],
    "id_2": [
        {"er": {"ip": "myhost", "port": 80}},
        {"ef": {"ip": "myhost", "port": 80}},
        {"er": {"app": "falsk"," port1": 81}},
        {"ef": {"app": "django", "port1": 85}}
    ]
}

我想让输出看起来像这样:

res_data = {
    "id_1": [
        {"er": {"ip": "myhost", "port": 80, "app": "falsk"," port1": 81}},
        {"ef": {"ip": "myhost", "port": 80, "app": "django", "port1": 85}}
    ],
    "id_2": [
        {"er": {"ip": "myhost", "port": 80, "app": "falsk", "port1": 81}},
        {"ef": {"ip": "myhost", "port": 80, "app": "django", "port1": 85}}
    ]
}

python中有没有简单的方法来实现它?

更新:基于评论和初步想法的解决方案

def merge_list_of_dict(data):
    merged_dict = dict()

    for k, v in data.items():

        tmp_tems = dict()
        for j in v:
            for ki, vi in j.items():
                if ki in tmp_tems:
                    tmp_tems[ki].update(vi)
                else:
                    tmp_tems[ki] = vi
        merged_dict[k] = tmp_tems
    return merged_dict

1 个答案:

答案 0 :(得分:2)

我采用的方法是使用update构建临时字典,根据密钥合并字典。然后我创建一个output字典然后打印它,以返回list格式。如果要跳过该步骤,可以在每个循环上直接打印{'entry': [tmpdict]}。我已使用pprint清除输出,但它显然是可选的。

import pprint

my_data= {'id_1': [{'er': {'ip': 'myhost', 'port': 80}},
          {'ef': {'ip': 'myhost', 'port': 80}},
          {'er': {'app': 'falsk', 'port1': 81}},
          {'ef': {'app': 'django', 'port1': 85}}],
 'id_2': [{'er': {'ip': 'myhost', 'port': 80}},
          {'ef': {'ip': 'myhost', 'port': 80}},
          {'er': {'app': 'falsk', 'port1': 81}},
          {'ef': {'app': 'django', 'port1': 85}}]}

output = {}
for entry, data in my_data.items():
    tmpdict = {}
    for item in data:
        for k,v in item.items():
            if not k in tmpdict:
                tmpdict[k] = {}
            tmpdict[k].update(v)

    output[entry] = [tmpdict]

pprint.pprint(output)