La lista de grupos de datos de diccionario por clave particular en Python se puede hacer usando el método itertools.groupby() .
Itertools.groupby()
Este método calcula las claves para cada elemento presente en iterable. Devuelve clave e iterable de elementos agrupados.
Sintaxis: itertools.groupby(iterable, key_func)
Parámetros:
- iterable: Iterable puede ser de cualquier tipo (lista, tupla, diccionario).
- key_func: una función que calcula claves para cada elemento presente en iterable.
Tipo de retorno: Devuelve claves y grupos consecutivos del iterable. Si la función clave no se especifica o es Ninguna, la clave predeterminada es una función de identidad y devuelve el elemento sin cambios.
Veamos los ejemplos:
Ejemplo 1: Supongamos que tenemos lista de diccionario de empleado y empresa.
INFO = [ {'employee': 'XYZ_1', 'company': 'ABC_1'}, {'employee': 'XYZ_2', 'company': 'ABC_2'}, {'employee': 'XYZ_3', 'company': 'ABC_3'}, {'employee': 'XYZ_4', 'company': 'ABC_3'}, {'employee': 'XYZ_5', 'company': 'ABC_2'}, {'employee': 'XYZ_6', 'company': 'ABC_3'}, {'employee': 'XYZ_7', 'company': 'ABC_1'}, {'employee': 'XYZ_8', 'company': 'ABC_2'}, {'employee': 'XYZ_9', 'company': 'ABC_1'} ]
Ahora necesitamos mostrar todo el grupo de datos por el nombre clave de la ‘compañía’.
Código:
Python3
# import a groupby() method # from itertools module from itertools import groupby # dictionary INFO = [ {'employee': 'XYZ_1', 'company': 'ABC_1'}, {'employee': 'XYZ_2', 'company': 'ABC_2'}, {'employee': 'XYZ_3', 'company': 'ABC_3'}, {'employee': 'XYZ_4', 'company': 'ABC_3'}, {'employee': 'XYZ_5', 'company': 'ABC_2'}, {'employee': 'XYZ_6', 'company': 'ABC_3'}, {'employee': 'XYZ_7', 'company': 'ABC_1'}, {'employee': 'XYZ_8', 'company': 'ABC_2'}, {'employee': 'XYZ_9', 'company': 'ABC_1'} ] # define a fuction for key def key_func(k): return k['company'] # sort INFO data by 'company' key. INFO = sorted(INFO, key=key_func) for key, value in groupby(INFO, key_func): print(key) print(list(value))
Producción:
ABC_1
[{‘empleado’: ‘XYZ_1’, ‘compañía’: ‘ABC_1′}, {‘empleado’: ‘XYZ_7’, ‘compañía’: ‘ABC_1′}, {‘empleado’: ‘XYZ_9’, ‘compañía’ : ‘ABC_1′}]
ABC_2
[{‘empleado’: ‘XYZ_2’, ‘compañía’: ‘ABC_2′}, {‘empleado’: ‘XYZ_5’, ‘compañía’: ‘ABC_2′}, {‘empleado’: ‘ XYZ_8’, ‘compañía’: ‘ABC_2′}]
ABC_3
[{‘empleado’: ‘XYZ_3’, ‘compañía’: ‘ABC_3′}, {‘empleado’: ‘XYZ_4’, ‘compañía’: ‘ABC_3′}, {‘empleado’: ‘XYZ_6’, ‘compañía’: ‘ABC_3’}]
Ejemplo 2: supongamos que tenemos una lista de diccionario de calificaciones y calificaciones de los estudiantes.
students = [ {'mark': '65','grade': 'C'}, {'mark': '86','grade': 'A'}, {'mark': '73','grade': 'B'}, {'mark': '49','grade': 'D'}, {'mark': '91','grade': 'A'}, {'mark': '79','grade': 'B'} ]
Ahora necesitamos mostrar todo el grupo de datos con la tecla ‘grado’.
Código:
Python3
# import required methods from itertools import groupby from operator import itemgetter # dictionary students = [ {'mark': '65', 'grade': 'C'}, {'mark': '86', 'grade': 'A'}, {'mark': '73', 'grade': 'B'}, {'mark': '49', 'grade': 'D'}, {'mark': '91', 'grade': 'A'}, {'mark': '79', 'grade': 'B'} ] # Sort students data by grade key. students = sorted(students, key = itemgetter('grade')) # Display data grouped by grade for key, value in groupby(students, key = itemgetter('grade')): print(key) for k in value: print(k)
Producción:
A {'mark': '86', 'grade': 'A'} {'mark': '91', 'grade': 'A'} B {'mark': '73', 'grade': 'B'} {'mark': '79', 'grade': 'B'} C {'mark': '65', 'grade': 'C'} D {'mark': '49', 'grade': 'D'}