From 1d653c44eded9dceebbd81744651d147efd70b3b Mon Sep 17 00:00:00 2001 From: KV Date: Mon, 30 Nov 2020 18:10:24 +0100 Subject: [PATCH] Replace accumulation loop with sum expressions Make a list from the group iterator for reusage in sum expressions and to pick first group entry. The expected group sizes are very small, so performance loss by creating a temporary list should be neglectable. Alternativly, itertools.tee(group, 3) could be called to triplicate the iterator, but it was not chosen for readability reasons. --- src/wireviz/wv_bom.py | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/src/wireviz/wv_bom.py b/src/wireviz/wv_bom.py index b7dda90..dbd5f79 100644 --- a/src/wireviz/wv_bom.py +++ b/src/wireviz/wv_bom.py @@ -103,14 +103,10 @@ def generate_bom(harness): # deduplicate bom bom = [] for _, group in groupby(sorted(bom_entries, key=bom_types_group), key=bom_types_group): - last_entry = None - total_qty = 0 - designators = [] - for group_entry in group: - designators.extend(make_list(group_entry.get('designators'))) - total_qty += group_entry['qty'] - last_entry = group_entry - bom.append({**last_entry, 'qty': round(total_qty, 3), 'designators': sorted(set(designators))}) + group_entries = list(group) + designators = sum((make_list(entry.get('designators')) for entry in group_entries), []) + total_qty = sum(entry['qty'] for entry in group_entries) + bom.append({**group_entries[0], 'qty': round(total_qty, 3), 'designators': sorted(set(designators))}) # add an incrementing id to each bom item return [{**entry, 'id': index} for index, entry in enumerate(bom, 1)]