Agrupe la lista de diccionarios a la lista de diccionarios con el mismo valor de propiedad

Tengo una lista de diccionarios y cada diccionario tiene propiedad person_id

[{'person_id': 1, 'something..': 'else'}, {'person_id': 3, 'something..': 'else'}, {'person_id': 1, 'something..': 'else'}] 

Cómo agrupar todos los diccionarios con el mismo ‘person_id’ en la lista y dividir la lista anterior de los usuarios a la lista de los diccionarios (la lista interna contiene solo los diccionarios con el mismo ‘person_id’).

 [[{'person_id': 1, 'something..': 'else'}, {'person_id': 1, 'something..': 'else'}], [{'person_id': 3, 'something..': 'else'}]] 

Hice esto con una iteración simple y la comprobación ya está en la lista de esos diccionarios, pero ¿existe una forma eficiente en Python?

Su entrada no está ordenada por person_id , así que use un enfoque de collections.defaultdict() con un bucle:

 from collections import defaultdict grouped = defaultdict(list) for person in inputlist: grouped[person['person_id']].append(person) grouped = grouped.values() 

Esto clasifica la lista de entrada en grupos y luego coloca todos los grupos en una lista externa. Si necesita que la salida esté ordenada por ID, puede usar:

 grouped = [grouped['pid'] for pid in sorted(grouped)] 

Si necesita la lista original en orden ordenada, o puede producirla en orden ordenado, también puede usar itertools.groupby() para hacer su agrupación:

 from itertools import groupby from operator import itemgetter grouped = [list(g) for p, g in groupby(inputlist, key=itemgetter('person_id'))] 

pero esto requiere que la inputlist se inputlist primero.