Python удаление и объединение дубликатов словарей из списка при создании подсписка - PullRequest
0 голосов
/ 22 апреля 2020

Я пытаюсь взять список хостов с сетевой информацией и создать список уникальных подсетей со списком доменов, связанных с su bnet. Пример списка хостов, сокращенный до трех, но это может быть несколько сотен / тысяч элементов:

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

Я нашел вопросы об удалении дубликатов словарей из списка и вопросы о слиянии (обновлении) словарей, но пока не нашел ничего похожего на это. объединение дубликатов, но в то же время создание списка (набора) доменов, найденных в других местах в списке хостов.

1 Ответ

2 голосов
/ 22 апреля 2020

Вы можете перебирать список хостов.

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'] ] })
...