summarize_from_feedback/utils/nested.py (23 lines of code) (raw):

import collections.abc def map_nested(d, f): new_d = {} for k, v in d.items(): if isinstance(v, dict): new_d[k] = map_nested(v, f) else: new_d[k] = f(v) return new_d def nested_reduce(list_of_nested, reducers): """Given list of nested dicts, returns a nested dict of reduced values f should be either a reducer function, or a nested dict, with values being reducer functions. """ new_nested = {} for k in list_of_nested[0].keys(): vals = [d[k] for d in list_of_nested] if isinstance(reducers, collections.abc.Callable): reducer = reducers else: assert isinstance(reducers, dict) reducer = reducers[k] if isinstance(list_of_nested[0][k], dict): new_nested[k] = nested_reduce(vals, reducer) else: new_nested[k] = reducer(vals) return new_nested