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.

Evite utilizar declaraciones “if” para verificar claves en un diccionario.

Estoy tratando de asignar algunos valores de los datos a una plantilla. Quiero llenar los valores (con algunas manipulaciones) en la plantilla solo si ya están presentes en ella. Mi plantilla tiene cientos de claves y mi objetivo es evitar la declaración “if” antes de cada manipulación y asignación.

El propósito de las declaraciones “if” es retrasar la evaluación de las manipulaciones que estoy realizando, ya que pueden ser costosas de realizar. Cualquier solución debe tener esto en cuenta.

data = {
    'a': 1,
    'b': 2,
    'c': 3,
    'd': 4,
    'e': 5
}
template1 = {
    'p': 'Nan',
    'q': 'Nan',
    'r': 'Nan'
}
template2 = {
    'p': 'Nan',
    's': 'Nan',
    't': 'Nan'
}
def func(template, data):
    if 'p' in template.keys():
        template['p'] = data['a']
    if 'q' in template.keys():
        template['q'] = data['b'][:2] + 'some manipulation'
    if 'r' in template.keys():
        template['r'] = data['c']
    if 's' in template.keys():
        template['s'] = data['d'] + 'some manipulation'
    if 't' in template.keys():
        template['t'] = data['e']

Sé que me falta algo básico, mi código y requisitos reales son bastante complejos y he intentado simplificarlos y reducirlos a esta estructura simple.

¡Gracias por tu ayuda de antemano!

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Una posible solución para evitar el uso de declaraciones condicionales antes de cada manipulación y asignación en el código dado es utilizar una comprensión de diccionario con la función get() para verificar si una clave está presente tanto en el diccionario de plantilla como en el diccionario de datos. Si la clave está presente, se manipula y asigna el valor correspondiente a la plantilla, de lo contrario, el valor de la plantilla permanece igual. Aquí está el código modificado:

    data = {
        'a': 1,
        'b': 2,
        'c': 3,
        'd': 4,
        'e': 5
    }
    
    template1 = {
        'p': 'Nan',
        'q': 'Nan',
        'r': 'Nan'
    }
    
    template2 = {
        'p': 'Nan',
        's': 'Nan',
        't': 'Nan'
    }
    
    def func(template, data):
        template = {k: v if (v := template.get(k)) is None else (
                    data['a'] if k == 'p' else
                    data['b'][:2] + 'alguna manipulación' if k == 'q' else
                    data['c'] if k == 'r' else
                    data['d'] + 'alguna manipulación' if k == 's' else
                    data['e']) for k, v in template.items()}
        return template
    

    En este código modificado, la comprensión de diccionario itera sobre las claves y valores del diccionario de plantilla. Para cada par clave-valor, se utiliza la función get() para obtener el valor correspondiente del diccionario de datos si la clave está presente, de lo contrario, se utiliza el valor actual del diccionario de plantilla (v if (v := template.get(k)) is None else). Luego, se asigna el valor manipulado a la clave correspondiente del diccionario de plantilla utilizando expresiones condicionales (data['a'] if k == 'p' else ... data['e']). Finalmente, se devuelve el diccionario de plantilla modificado resultante.

Comments are closed.