recorrer - Diccionario anidado de comprensión de python
python diccionarios (3)
Añadiendo algunos saltos de línea y sangría:
data = {
outer_k: {inner_k: myfunc(inner_v)}
for outer_k, outer_v in outer_dict.items()
for inner_k, inner_v in outer_v.items()
}
... hace que sea obvio que usted realmente tiene una comprensión de dict única, "bidimensional". Lo que realmente quieres es probablemente:
data = {
outer_k: {
inner_k: myfunc(inner_v)
for inner_k, inner_v in outer_v.items()
}
for outer_k, outer_v in outer_dict.items()
}
(que es exactamente lo que Blender sugirió en su respuesta, con espacios en blanco adicionales).
Tengo problemas para comprender las comprensiones de diccionarios anidados en Python 3. El resultado que obtengo del ejemplo a continuación genera la estructura correcta sin errores, pero solo incluye uno de los pares clave: valor interno. No he encontrado un ejemplo de comprensión de un diccionario anidado como este; En Google "python de comprensión de diccionario anidado" se muestran ejemplos heredados, comprensiones no anidadas o respuestas resueltas utilizando un enfoque diferente. Puede que esté usando la sintaxis incorrecta.
Ejemplo:
data = {outer_k: {inner_k: myfunc(inner_v)} for outer_k, outer_v in outer_dict.items() for inner_k, inner_v in outer_v.items()}
Este ejemplo debería devolver el diccionario original, pero con el valor interno modificado por myfunc
.
Estructura del diccionario outer_dict, así como el resultado:
{outer_k: {inner_k: inner_v, ...}, ...}
{inner_k: myfunc(inner_v)}
no es una comprensión de diccionario. Es solo un diccionario.
Probablemente estés buscando algo como esto en su lugar:
data = {outer_k: {inner_k: myfunc(inner_v) for inner_k, inner_v in outer_v.items()} for outer_k, outer_v in outer_dict.items()}
En aras de la legibilidad, no anide las comprensiones del diccionario y las enumere demasiado.
{ok: {ik: myfunc(iv) for ik, iv in ov.items()} for ok, ov in od.items()}
dónde
ok-clave externa
llave interna
valor ov-exterior
iv-valor interno od-exterior diccionario Así es como lo recuerdo.