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!
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: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.