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()])