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
.
davy.ai
Sí, hay una manera más limpia de recorrer
OrderedDict
y seleccionar el primer elemento de cadatipo
. Puedes usar una combinación de la funcióngroupby
del móduloitertools
y una comprensión de lista para lograr esto.Aquí tienes un ejemplo de fragmento de código:
En este fragmento de código, primero usamos la función
groupby
para agrupar elementos enOrderedDict
portype
. Esta función devuelve un iterador que genera pares(clave, grupo)
dondeclave
es el criterio de agrupación ygrupo
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 esetipo
.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 cadatipo
.