如果它们具有共同的键值对,如何合并字典中的键值?

时间:2016-10-05 07:59:38

标签: python list dictionary merge

我有一个词典列表,

$.ajax()

如何制作以使输出如下所示:

list = [
    {'hostname': 'a', 'ipaddr':'abcde'},
    {'hostname': 'a', 'ipaddr':'fghijkl'},
    {'hostname': 'a', 'ipaddr':'bbbbbb'},
    {'hostname': 'b', 'ipaddr':'xxxx'}
]

修改: 在此步骤之前,我已经过滤了所选主机名的JSON列表

outputList = [
    {
        'hostname': 'a',
        'ipaddr': ['abcde', 'fghijkl', 'bbbbbb']
    },
    {
        'hostname': 'b',
        'ipaddr':'xxxx'
    }
]

然后,给定一个巨大的JSON字典列表(上面称为“列表”),我必须筛选出相应的主机名和ipaddresses,最好根据主机名分组,以便我可以轻松地在其他地方解析它。

4 个答案:

答案 0 :(得分:1)

lists = [
    {'hostname': 'a', 'ipaddr':'abcde'},
    {'hostname': 'a', 'ipaddr':'fghijkl'},
    {'hostname': 'a', 'ipaddr':'bbbbbb'},
    {'hostname': 'b', 'ipaddr':'xxxx'}
]

hostnames = set([d['hostname'] for d in lists])

outputlist= list()

for hostname in hostnames:
    od = {
        'hostname': hostname,
        'ipaddr': []
        }
    for d in lists:
        if d['hostname'] == hostname:
            od['ipaddr'].append(d['ipaddr'])
    outputlist.append(od)

此解决方案假定lists中的所有词典都包含密钥'hostname'

答案 1 :(得分:1)

这是一种方式:

inputList = [
    {'hostname': 'a', 'ipaddr':'abcde'},
    {'hostname': 'a', 'ipaddr':'fghijkl'},
    {'hostname': 'a', 'ipaddr':'bbbbbb'},
    {'hostname': 'b', 'ipaddr':'xxxx'}
]

outputList = {}
for d in inputList:
    od = outputList.setdefault(d['hostname'], {})
    od.setdefault('hostname', d['hostname'])
    od.setdefault('ipaddr', []).append(d['ipaddr'])
outputList = sorted(outputList.values(), key=lambda x: x['hostname'])

assert outputList == [
    {
        'hostname': 'a',
        'ipaddr': ['abcde', 'fghijkl', 'bbbbbb']
    },
    {
        'hostname': 'b',
        'ipaddr':['xxxx']
    }
]

答案 2 :(得分:0)

您可以使用以下代码:

list_1 = [
{'hostname': 'a', 'ipaddr':'abcde'},
{'hostname': 'a', 'ipaddr':'fghijkl'},
{'hostname': 'a', 'ipaddr':'bbbbbb'},
{'hostname': 'b', 'ipaddr':'xxxx'}
]

out_list = []

for each_dict in list_1:
    if out_list:
        for out_dict in out_list:
            if out_dict['hostname']==each_dict['hostname']:
                out_dict['ipaddr'].append(each_dict['ipaddr'])
            else:
                temp_dict = {}
                temp_dict['hostname']=each_dict['hostname']
                temp_dict['ipaddr']=[each_dict['ipaddr'],]
                out_list.append(temp_dict)
    else:
        temp_dict = {}
        temp_dict['hostname']=each_dict['hostname']
        temp_dict['ipaddr']=[each_dict['ipaddr'],]
        out_list.append(temp_dict)

print out_list

答案 3 :(得分:0)

from collections import defaultdict

lst = [
    {'hostname': 'a', 'ipaddr':'abcde'},
    {'hostname': 'a', 'ipaddr':'fghijkl'},
    {'hostname': 'a', 'ipaddr':'bbbbbb'},
    {'hostname': 'b', 'ipaddr':'xxxx'}
]

d = defaultdict(list)

for item in lst:
    d[item['hostname']].append(item['ipaddr'])

output = [dict(zip(['hostname', 'ipaddr'], item)) for item in d.items()]