Lista de grupos de datos de diccionario por clave particular en Python

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'}

Publicación traducida automáticamente

Artículo escrito por kg_code y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *