Code: Alles auswählen
from itertools import groupby
from pprint import pprint
weights = [
{'title': 'Part A 1', 'C[kg]': 12, 'B[kg]': 34.7, 'A[kg]': 21},
{'title': 'Part A 2', 'C[kg]': 12.1, 'B[kg]': 34.3, 'A[kg]': 21.1},
{'title': 'Part A 3', 'C[kg]': 13, 'B[kg]': 34.2, 'A[kg]': 21},
{'title': 'Part B 1', 'C[kg]': 11, 'B[kg]': 31, 'A[kg]': 28.2},
{'title': 'Part B 2', 'C[kg]': 11.2, 'B[kg]': 37.4, 'A[kg]': 21},
{'title': 'Part B 3', 'C[kg]': 19, 'B[kg]': 34, 'A[kg]': 21},
{'title': 'Part B 4', 'C[kg]': 12.1, 'B[kg]': 31, 'A[kg]': 26},
{'title': 'Part C 1', 'C[kg]': 13, 'B[kg]': 30, 'A[kg]': 22},
{'title': 'Part C 2', 'C[kg]': 13, 'B[kg]': 30, 'A[kg]': 22},
{'title': 'Part C 3', 'C[kg]': 13, 'B[kg]': 30, 'A[kg]': 22},
{'title': 'Part C 4', 'C[kg]': 13, 'B[kg]': 30, 'A[kg]': 22},
{'title': 'Part C 5', 'C[kg]': 13, 'B[kg]': 30, 'A[kg]': 22},
{'title': 'Part C 6', 'C[kg]': 13, 'B[kg]': 30, 'A[kg]': 22},
]
WEIGHT_KEYS = ('A[kg]', 'B[kg]', 'C[kg]')
def keyfunc(item):
return item['title'][5] # The part character.
def add_items(a, b):
for key in WEIGHT_KEYS:
a[key] += b[key]
return a
weights.sort(key=keyfunc)
result = list()
for key, items in groupby(weights, keyfunc):
zero = dict.fromkeys(WEIGHT_KEYS, 0)
zero['part'] = key
result.append(reduce(add_items, items, zero))
pprint(result)
Hier gibt's eine Funktion `keyfunc()` die den Schlüssel zum sortieren und gruppieren ermittelt, in diesem Fall also der Buchstabe. Falls die Liste immer nach Parts sortiert ist, dann kann man sich den `sort()` Aufruf sparen.
Die Parts werden dann mit `itertools.groupby()` gruppiert. In der Schleife wird ein Dictionary mit dem Partbuchstaben als ('part': buchstabe) Eintrag und einer 0 für jedes der Gewichte erzeugt und dann werden die Dictionaries des gleichen Parts mit der `reduce()` Funktion und einer geeigneten "Additionsfunktion" für zwei Dictionaries aufsummiert.
Ergebnis:
Code: Alles auswählen
$ python test.py
[{'A[kg]': 63.100000000000001,
'B[kg]': 103.2,
'C[kg]': 37.100000000000001,
'part': 'A'},
{'A[kg]': 96.200000000000003,
'B[kg]': 133.40000000000001,
'C[kg]': 53.300000000000004,
'part': 'B'},
{'C[kg]': 78, 'B[kg]': 180, 'A[kg]': 132, 'part': 'C'}]