Búsqueda de sitios web

¿Cómo convertir un OrderedDict anidado a Dict en Python?


Python es un lenguaje de programación popular que se usa ampliamente para diversas aplicaciones, incluido el desarrollo web, la ciencia de datos y el aprendizaje automático. Su simplicidad, flexibilidad y facilidad de uso lo convierten en una excelente opción para desarrolladores de todos los niveles. Una de las características que distingue a Python es la clase OrderedDict, que es una subclase de diccionario que recuerda el orden en que se insertaron los elementos. Sin embargo, en algunos casos, es posible que necesitemos convertir un OrderedDict anidado en un dict normal para facilitar el procesamiento posterior de los datos.

En este tutorial, explicaremos qué es un OrderedDict anidado y por qué puede ser necesario convertirlo en un dict normal. Lo guiaremos a través del proceso de convertir un OrderedDict anidado en un dict utilizando un enfoque recursivo. También proporcionaremos ejemplos de cómo usar el código y explicaremos los beneficios de usar un dict normal en lugar de un OrderedDict anidado. Entonces, profundicemos en la siguiente sección del artículo para aprender más sobre cómo convertir un OrderedDict anidado en un dict.

¿Qué es un OrderedDict?

Un OrderedDict es una subclase de un diccionario normal en el que se mantiene el orden de los elementos. Esto significa que los elementos de un OrderedDict se almacenan en el orden en que se agregaron al diccionario.

Ahora pasemos a Nested OrderedDict. Como sugiere el nombre, un OrderedDict anidado es simplemente un OrderedDict dentro de otro OrderedDict. Esto significa que los valores del OrderedDict externo son en sí mismos OrderedDicts. Esta es una estructura de datos útil para representar datos anidados o jerárquicos.

A continuación se muestra un ejemplo de un OrderedDict anidado:

from collections import OrderedDict

nested_odict = OrderedDict({
    'Name': 'John Doe',
    'Age': 25,
    'Contact': OrderedDict({
        'Email': 'johndoe@example.com',
        'Phone': '123-456-7890'
    }),
    'Address': OrderedDict({
        'Street': '123 Main St',
        'City': 'Anytown',
        'State': 'CA',
        'Zip': '12345'
    })
})

En el ejemplo anterior, hemos creado un OrderedDict anidado que representa información sobre una persona, incluido su nombre, edad, información de contacto y dirección. Las claves 'Contacto' y 'Dirección' tienen valores que en sí mismos son OrderedDicts.

La estructura de Nested OrderedDict se puede visualizar de la siguiente manera:

{
    'Name': 'John Doe',
    'Age': 25,
    'Contact': {
        'Email': 'johndoe@example.com',
        'Phone': '123-456-7890'
    },
    'Address': {
        'Street': '123 Main St',
        'City': 'Anytown',
        'State': 'CA',
        'Zip': '12345'
    }
}

Ahora que hemos aprendido sobre la estructura de Nested OrderedDict, comprendamos cómo convertir este Nested OrderedDict en un dict normal utilizando un enfoque recursivo.

¿Cómo convertir un OrderedDict anidado a dict?

Una forma de convertir un Nested OrderedDict en un dict es mediante recursividad. La recursividad es una técnica de programación que implica que una función se llame a sí misma. En este caso, podemos escribir una función que se llame a sí misma de forma recursiva para convertir cada OrderedDict anidado en un dict normal.

A continuación se muestra un ejemplo de cómo implementar la recursividad para convertir un Nested OrderedDict en un dict:

def nested_odict_to_dict(nested_odict):
   # Convert the nested ordered dictionary into a regular dictionary and store it in the variable "result".
   result = dict(nested_odict)

   # Iterate through each key-value pair in the dictionary.
   for key, value in result.items():

       # Check if the value is an instance of the OrderedDict class.
       if isinstance(value, OrderedDict):
           # If the value is an instance of the OrderedDict class, recursively call the function on that value and store the returned dictionary in the "result" dictionary.
           result[key] = nested_odict_to_dict(value)
   return result

En el código anterior, primero creamos un dictado normal a partir de Nested OrderedDict usando la función incorporada dict(). Luego recorremos cada par clave-valor en el dictado y verificamos si el valor es una instancia de OrderedDict. Si es así, llamamos a la misma función de forma recursiva en ese valor y reemplazamos el valor en el dict original con el dict regular devuelto.

Analicemos el código y comprendamos cómo funciona:

result = dict(nested_odict)

Esta línea crea un nuevo diccionario (resultado) al convertir el diccionario ordenado pasado (nested_odict) en un diccionario normal.

for key, value in result.items():
    if isinstance(value, OrderedDict):
        result[key] = nested_odict_to_dict(value)

Este bucle recorre en iteración todos los elementos del diccionario de resultados. Para cada par clave-valor, verifica si el valor es un diccionario ordenado. Si es así, la función se llama a sí misma de forma recursiva, pasa el diccionario ordenado como argumento y reemplaza el valor del resultado con el diccionario devuelto.

Entendámoslo ahora con la ayuda de un ejemplo.

Ejemplo de conversión de OrderedDict anidado en Dict

Usemos el mismo Nested OrderedDict que vimos antes y convirtámoslo en un dict normal usando la función nested_odict_to_dict():

from collections import OrderedDict

nested_odict = OrderedDict({
    'Name': 'John Doe',
    'Age': 25,
    'Contact': OrderedDict({
        'Email': 'johndoe@example.com',
        'Phone': '123-456-7890'
    }),
    'Address': OrderedDict({
        'Street': '123 Main St',
        'City': 'Anytown',
        'State': 'CA',
        'Zip': '12345'
    })
})

regular_dict = nested_odict_to_dict(nested_odict)
print(regular_dict)

Este fragmento de código anterior crea un diccionario ordenado nested_odict con varios niveles de anidamiento y luego llama a una función nested_odict_to_dict para convertirlo en un diccionario anidado normal. La salida de este código será un diccionario anidado con las mismas claves y valores que el diccionario ordenado original nested_odict, pero sin la garantía de pedido.

Producción

{
    'Name': 'John Doe',
    'Age': 25,
    'Contact': {
        'Email': 'johndoe@example.com',
        'Phone': '123-456-7890'
    },
    'Address': {
        'Street': '123 Main St',
        'City': 'Anytown',
        'State': 'CA',
        'Zip': '12345'
    }
}

Como puede ver, Nested OrderedDict se ha convertido con éxito en un dict normal utilizando la función nested_odict_to_dict().

Conclusión

En este artículo, analizamos cómo convertir un OrderedDict anidado en un dict normal utilizando un enfoque recursivo. Explicamos qué es un OrderedDict y qué es un OrderedDict anidado. También proporcionamos un ejemplo de Nested OrderedDict que representa información sobre una persona. Para convertir un OrderedDict anidado en un dictado normal, utilizamos la recursividad para escribir una función que se llama a sí misma para convertir cada OrderedDict anidado en un dictado normal. También proporcionamos un ejemplo de cómo usar la función para convertir el Nested OrderedDict que creamos anteriormente en un dict normal. Al convertir un Nested OrderedDict en un dict normal, podemos simplificar el procesamiento de datos y realizar diversas operaciones con mayor facilidad.

Artículos relacionados: