import itertools
def _build_combinations(val_dict):
for instance in itertools.product(*val_dict.values()):
yield dict(zip(val_dict.keys(), instance))
def params_to_index(val_dict, param_dict):
result = 0
for key, values in val_dict.items():
result *= len(values)
result += values.index(param_dict[key])
return result
def index_to_params(val_dict, i):
param_dict = {}
for key, values in list(val_dict.items())[::-1]:
i, v_index = divmod(i, len(values))
param_dict[key] = values[v_index]
return param_dict
def test_index():
val_dict = dict(
a=[1, 2],
b=[3, 4, 5],
c=[6, 7, 8, 9]
)
for i, param_dict in enumerate(_build_combinations(val_dict)):
assert i == params_to_index(val_dict, param_dict)
assert param_dict == index_to_params(val_dict, i)
test_index()