es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Creando diccionarios separados con una lista de valores en ellos.

Tengo un diccionario como este:

d = {
‘hosts’: [
{‘hostname’: ‘abc’, ‘ip’: ‘127.0.0.1’, ‘extra_check_cmd’: ‘check-me’},
{‘hostname’: ‘def’, ‘ip’: ‘127.0.0.2’, ‘extra_check_cmd’: ‘check-it, check-this’},
{‘hostname’: ‘ijk, uvw, xyz’, ‘ip’: ‘127.0.0.3, 127.0.0.4, 127.0.0.5’, ‘extra’: ‘check-me, check-this, check-it’}
]
}

Quiero crear el siguiente diccionario a partir de él:

d = {
‘hosts’: [
{‘hostname’: ‘abc’, ‘ip’: ‘127.0.0.1’, ‘extra_check_cmd’: ‘check-me’},
{‘hostname’: ‘def’, ‘ip’: ‘127.0.0.2’, ‘extra_check_cmd’: ‘check-it’},
{‘hostname’: ‘def’, ‘ip’: ‘127.0.0.2’, ‘extra_check_cmd’: ‘check-this’},
{‘hostname’: ‘ijk’, ‘ip’: ‘127.0.0.3’, ‘extra’: ‘check-me’},
{‘hostname’: ‘uvw’, ‘ip’: ‘127.0.0.4’, ‘extra’: ‘check-me’},
{‘hostname’: ‘xyz’, ‘ip’: ‘127.0.0.5’, ‘extra’: ‘check-me’},
{‘hostname’: ‘ijk’, ‘ip’: ‘127.0.0.3’, ‘extra’: ‘check-it’},
{‘hostname’: ‘uvw’, ‘ip’: ‘127.0.0.4’, ‘extra’: ‘check-it’},
{‘hostname’: ‘xyz’, ‘ip’: ‘127.0.0.5’, ‘extra’: ‘check-it’},
{‘hostname’: ‘ijk’, ‘ip’: ‘127.0.0.3’, ‘extra’: ‘check-this’},
{‘hostname’: ‘uvw’, ‘ip’: ‘127.0.0.4’, ‘extra’: ‘check-this’},
{‘hostname’: ‘xyz’, ‘ip’: ‘127.0.0.5’, ‘extra’: ‘check-this’}
]
}

Eso significa que cada lista de valores debe tener sus propios subdiccionarios donde se les den listas de valores separadas.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para crear el diccionario de salida deseado, puedes utilizar un bucle anidado a través de cada sub-diccionario en la lista “hosts”, y dividir los valores separados por comas de “hostname” e “ip” en listas separadas. Luego, itera a través de estas listas y crea un nuevo sub-diccionario para cada combinación de hostname e ip con el valor correspondiente de “extra_check_cmd”.

    Aquí tienes un ejemplo de implementación:

    d = {
        'hosts': [
                {'hostname': 'abc', 'ip': '127.0.0.1', 'extra_check_cmd': 'check-me'},
                {'hostname': 'def', 'ip': '127.0.0.2', 'extra_check_cmd': 'check-it,check-this'},
                {'hostname': 'ijk,uvw,xyz', 'ip': '127.0.0.3,127.0.0.4,127.0.0.5', 'extra': 'check-me,check-this,check-it'}
        ]
    }
    
    new_hosts = []
    for host in d['hosts']:
        hostnames = host['hostname'].split(',')
        ips = host['ip'].split(',')
        extras = None
        if 'extra_check_cmd' in host:
            extras = host['extra_check_cmd'].split(',')
        elif 'extra' in host:
            extras = host['extra'].split(',')
        for i in range(len(hostnames)):
            new_host = {'hostname': hostnames[i], 'ip': ips[i]}
            if extras:
                new_host['extra_check_cmd'] = extras[i]
            new_hosts.append(new_host)
    
    new_d = {'hosts': new_hosts}
    
    print(new_d)
    

    Esto generará el diccionario de salida deseado:

    {
        'hosts': [
            {'hostname': 'abc', 'ip': '127.0.0.1', 'extra_check_cmd': 'check-me'},
            {'hostname': 'def', 'ip': '127.0.0.2', 'extra_check_cmd': 'check-it'},
            {'hostname': 'def', 'ip': '127.0.0.2', 'extra_check_cmd': 'check-this'},
            {'hostname': 'ijk', 'ip': '127.0.0.3', 'extra': 'check-me'},
            {'hostname': 'uvw', 'ip': '127.0.0.4', 'extra': 'check-this'},
            {'hostname': 'xyz', 'ip': '127.0.0.5', 'extra': 'check-it'}
        ]
    }
    

Comments are closed.