【问题标题】:Python remove and merge duplicate dictionaries from list while building sub listPython在构建子列表时从列表中删除并合并重复的字典
【发布时间】:2020-08-04 18:51:14
【问题描述】:

我正在尝试获取包含网络信息的主机列表,并生成唯一子网列表以及与子网关联的域列表。主机列表示例,缩短为三个,但这可能是数百/数千个项目:

hosts = [{
    'name': 'foo',
    'subnet_address': '192.168.1.0',
    'subnet_mask': '255.255.254.0',
    'domain': 'foo.example.com'
}, {
    'name': 'bar',
    'subnet_address': '192.168.2.0',
    'subnet_mask': '255.255.254.0',
    'domain': 'bar.example.com'
}, {
    'name': 'baz',
    'subnet_address': '192.168.2.0',
    'subnet_mask': '255.255.254.0',
    'domain': 'foo.example.com'
}]

这是我想要实现的输出类型,subnet_address 是唯一键,我想为它们构建域关联列表:

[{
    'subnet_address': '192.168.1.0',
    'subnet_mask': '255.255.254.0',
    'domains': [
        'foo.example.com'
    ]
}, {
    'subnet_address': '192.168.2.0',
    'subnet_mask': '255.255.254.0',
    'domains': [
        'bar.example.com',
        'foo.example.com'
    ]
}]

我发现了有关从列表中删除重复字典的问题以及有关合并(更新)字典的问题,但尚未找到与此类似的任何问题,合并重复但同时构建找到的域列表(集)主机列表中的其他位置。

【问题讨论】:

  • 唯一键到底是什么? subnet_addresssubnet_mask。你必须决定一个。
  • 我更新了问题,以便 subnet_address 是“主键”,尽管我很想知道 subnet_addresssubnet_mask 是否可以一起用作主键..I假设可以使用“192.168.1.0/23”格式将它们连接在一起

标签: python list dictionary merge duplicates


【解决方案1】:

您可以遍历主机列表。

subnets = []

for host in hosts:
    addr = host['subnet_address']
    added = False
    # try to find a subnet with given address
    for subnet in subnets:
        if subnet['subnet_address'] == addr:
            # if found, add domain to list
            subnet['domains'].append(host['domain'])
            # and remember that we found a matching subnet
            added = True
            break
    if not added:
        # if we didn't find any subnet, add a new one
        subnets.append({'subnet_address': addr,
                       'subnet_mask': host['subnet_mask'],
                       'domains': [ host['domain'] ] })

【讨论】:

  • 谢谢,这行得通!我在将域附加到列表之前添加了一项检查,以确保域列表是唯一的
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-03
  • 2020-03-03
  • 2013-07-06
  • 2011-10-28
  • 2020-05-20
相关资源
最近更新 更多