No hace mucho tiempo que comencé a aprender Python, pero realmente quiero excavar en él. Y cavar duro. Así que aquí hay una tarea que he estado estudiando por un tiempo, pero aún no he descifrado:
Me dieron una combinación mixta de diccionarios anidados y listas (llamémoslo "combinación"), y tengo que implementar función que permitirá el acceso a los elementos anidados como atributos de objeto, también tratar de alguna manera los elementos de combinación como iterables. Esto debe ser algo como esto:Complejos diccionarios anidados que se transforman en objetos en python
combination = {
'item1': 3.14,
'item2': 42,
'items': [
'text text text',
{
'field1': 'a',
'field2': 'b',
},
{
'field1': 'c',
'field2': 'd',
},
]
}
def function(combination):
...
modo que
list(function(combination).items.field1)
dará: ['a', 'c']
y
list(function(combination).item1)
dará: [3.14]
.
Editar Como se ha mencionado por @FM, que perdió descripción del manejo de elementos no dict: list(function(combination).items[0])
>>>['text text text']
Probé la implementación de una clase (felicitaciones a Marc) para que me ayude:
class Struct:
def __init__(self, **entries):
self.__dict__.update(entries)
y luego utilizarlo en la función como return Struct(**combination)
Mientras que ser ver ingenioso, es solo el primer paso para el resultado deseado.
Pero como el siguiente paso necesita profundizar, me agobia y no puedo hacerlo por mí mismo.
Por lo tanto, le pido amablemente su ayuda.
Michael.
+1 para una pregunta interesante. Pero su deseo de saltar directamente de una clave como 'items' a una clave como' field1' parece estar en tensión con un enfoque general que conserva toda la información. ¿Es este último un objetivo importante para ti? Más específicamente, ¿cómo prevé el acceso a los elementos no dict almacenados en 'items' (' 'text text text'')? – FMc
@FM _combination_ no se basa en un esquema de información real específico, por lo que cualquier inconsistencia lógica no significa mucho (si lo entendí correctamente). El acceso a elementos no dict es un punto importante. Creo que 'result.items' debería soportar slicing y tal. Voy a editar la pregunta. –