def dict_subset(dict_, keys, default=util_const.NoParam): """ Get a subset of a dictionary Args: dict_ (Mapping): superset dictionary keys (Iterable): keys to take from ``dict_`` default (object, optional): if specified uses default if keys are missing Returns: OrderedDict: subset dictionary SeeAlso: :func:`dict_isect` - similar functionality, but will only take existing keys Example: >>> import ubelt as ub >>> dict_ = {'K': 3, 'dcvs_clip_max': 0.2, 'p': 0.1} >>> keys = ['K', 'dcvs_clip_max'] >>> subdict_ = ub.dict_subset(dict_, keys) >>> print(ub.repr2(subdict_, nl=0)) {'K': 3, 'dcvs_clip_max': 0.2} """ keys = list(keys) items = util_list.take(dict_, keys, default) subdict_ = OrderedDict(list(zip(keys, items))) return subdict_
def dict_subset(dict_, keys, default=util_const.NoParam, cls=OrderedDict): """ Get a subset of a dictionary Args: dict_ (Dict[KT, VT]): superset dictionary keys (Iterable[KT]): keys to take from ``dict_`` default (Optional[object] | util_const._NoParamType): if specified uses default if keys are missing. cls (Type[Dict], default=OrderedDict): type of the returned dictionary. Returns: Dict[KT, VT]: subset dictionary SeeAlso: :func:`dict_isect` - similar functionality, but ignores missing keys Example: >>> import ubelt as ub >>> dict_ = {'K': 3, 'dcvs_clip_max': 0.2, 'p': 0.1} >>> keys = ['K', 'dcvs_clip_max'] >>> subdict_ = ub.dict_subset(dict_, keys) >>> print(ub.repr2(subdict_, nl=0)) {'K': 3, 'dcvs_clip_max': 0.2} """ keys = list(keys) items = util_list.take(dict_, keys, default) subdict_ = cls(list(zip(keys, items))) return subdict_
def main(): import ubelt as ub from ubelt import util_list from ubelt.util_list import take import random from math import e # # Data N = 100 array = [random.random() for _ in range(N)] indices = [random.randint(0, N - 1) for _ in range(int(N // e))] ti = ub.Timerit(2 ** 11, bestof=2 ** 8, verbose=1) for timer in ti.reset('take'): with timer: list(take(array, indices)) for timer in ti.reset('util_list.take'): with timer: list(util_list.take(array, indices)) for timer in ti.reset('ub.take'): with timer: list(ub.take(array, indices)) print('---') # import pandas as pd # df = pd.DataFrame(rankings) # print('df =\n{}'.format(df)) print('rankings = {}'.format(ub.repr2(ti.rankings, precision=9, nl=2))) print('consistency = {}'.format(ub.repr2(ti.consistency, precision=9, nl=2))) positions = ub.ddict(list) for m1, v1 in ti.rankings.items(): for pos, label in enumerate(ub.argsort(v1), start=0): positions[label].append(pos) average_position = ub.map_vals(lambda x: sum(x) / len(x), positions) print('average_position = {}'.format(ub.repr2(average_position)))