reconstruir la matriz de Python basada en elementos comunes

Estoy intentando crear una lista de diccionarios que agrupan valores comunes en un conjunto de datos determinado. Los datos se formatean de la siguiente manera

data = [{"CustName":"customer1", "PartNum":"part1"}, {"CustName":"customer2", "PartNum":"part2"}, {"CustName":"customer1", "PartNum":"part3"}, {"CustName":"customer2", "PartNum":"part4"}] 

lo que quiero es

 cleanedData = [ {"CustName":"customer1", "parts":[{"PartNum":"part1"}, {"PartNum":"part3"}]}, {"CustName":"customer2", "parts":[{"PartNum":"part2"}, {"PartNum":"part4"}]}] 

la forma en que estoy tratando de trabajar requiere varios bucles, se ve feo y no se siente muy pythonico. También siento que esto no escalará muy bien. Actualmente, los datos de entrada son pequeños: menos de 100 elementos, pero potencialmente esto podría ser miles de elementos, por lo que los múltiples bucles en los bucles parecen ineficientes.

 data = [{"CustName":"customer1", "PartNum":"part1"}, {"CustName":"customer2", "PartNum":"part2"}, {"CustName":"customer1", "PartNum":"part3"}, {"CustName":"customer2", "PartNum":"part4"}] customers = [] cleanedData = [] for d in data: if d["CustName"] not in customers: customers.append(d["CustName"]) for c in customers: parts = [] for d in data: if d["CustCode"] == c: parts.append(d) cust = {"CustName":c} cust.update({"parts":parts}) cleanedData.append(cust) 

¿Puede alguien ayudar y ofrecer una forma más sencilla de hacer esto? ¿Existe una función incorporada que ayude con este tipo de manipulación de datos?

Puede utilizar collections.defaultdict .

 d = defaultdict(list) for item in data: d[item['CustName']].append({'PartNum': item['PartNum']}) print(d) 

Y opcionalmente, siguiendo la lista de comprensión si lo desea en la lista:

 print([{'CustName': key, 'parts': value} for key, value in d.items()])