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.

Python: cómo seleccionar n número de elementos de cada tipo de OrderedDict?

Tengo un serializador de Django que devuelve un OrderedDict desde serializer.data. Puede contener, por ejemplo, este tipo de datos:

[OrderedDict([('id', '1'), ('date', '2022-01-08'), ('type', 'A')]), OrderedDict([('id', '2'), ('date', '2022-01-09'), ('type', 'A')]), OrderedDict([('id', '3'), ('date', '2022-01-08'), ('type', 'B')]), OrderedDict([('id', '4'), ('date', '2022-01-09'), ('type', 'B')]),
OrderedDict([('id', '5'), ('date', '2022-01-08'), ('type', 'C')]), OrderedDict([('id', '6'), ('date', '2022-01-09'), ('type', 'C')])]

Me gustaría tomar el primer elemento de cada type y crear un json con esos datos. Podría usar bucles for para iterar a través del diccionario y crear una nueva lista que contenga un elemento de cada tipo: A, B y C. Me gustaría saber si hay alguna forma más limpia y ordenada de recorrer el diccionario y seleccionar un número n de cada type.

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Sí, hay una manera más limpia de recorrer OrderedDict y seleccionar el primer elemento de cada tipo. Puedes usar una combinación de la función groupby del módulo itertools y una comprensión de lista para lograr esto.

    Aquí tienes un ejemplo de fragmento de código:

    from itertools import groupby
    
    data = [
        OrderedDict([('id', '1'), ('date', '2022-01-08'), ('type', 'A')]), 
        OrderedDict([('id', '2'), ('date', '2022-01-09'), ('type', 'A')]), 
        OrderedDict([('id', '3'), ('date', '2022-01-08'), ('type', 'B')]), 
        OrderedDict([('id', '4'), ('date', '2022-01-09'), ('type', 'B')]), 
        OrderedDict([('id', '5'), ('date', '2022-01-08'), ('type', 'C')]), 
        OrderedDict([('id', '6'), ('date', '2022-01-09'), ('type', 'C')])]
    
    # Usar groupby para agrupar elementos por "tipo"
    grouped_data = {k: list(v) for k, v in groupby(data, key=lambda x: x['type'])}
    
    # Usar comprensión de lista para seleccionar el primer elemento de cada grupo
    result = [v[0] for k, v in grouped_data.items()]
    
    # Usar json.dumps para convertir la lista a formato JSON
    json_data = json.dumps(result)
    

    En este fragmento de código, primero usamos la función groupby para agrupar elementos en OrderedDict por type. Esta función devuelve un iterador que genera pares (clave, grupo) donde clave es el criterio de agrupación y grupo es un iterador que genera los elementos del grupo.

    Luego usamos una comprensión de diccionario para crear un nuevo diccionario donde las claves son los valores de type y los valores son las listas de elementos que pertenecen a ese tipo.

    Finalmente, usamos la comprensión de lista para seleccionar el primer elemento de cada grupo y luego convertimos la lista resultante a formato JSON usando el módulo json. Esto produce un objeto JSON que contiene el primer elemento de cada tipo.

Comments are closed.