2014-10-27 4 views
-2

Пять параметров могут иметь различные len (включая пустые). Я написал длинный код для первых трех параметров, для большего количества параметров для более крупного кода с повторами. Как свести к минимуму код?python: комбинация списков в dict, с разным размером списка

params1 = [1,2] 
params2 = [] 
params3 = [3,4,5,6] 
# ... 
params5 = [7,8] 

# for 3 params example: 
summary = {} 
if 0 < len(params1): 
    for param1 in params1: 
     summary['param1'] = param1 
     if 0 < len(params2): 
      for param2 in params2: 
       summary['param2'] = param2 
       if 0 < len(params3): 
        for param3 in params3: 
         summary['param3'] = param3 
         print summary 
       else: 
        print summary 
     else: 
      if 0 < len(params3): 
       for param3 in params3: 
        summary['param3'] = param3 
        print summary 
      else: 
       print summary 
else: 
    if 0 < len(params2): 
     for param2 in params2: 
      summary['param2'] = param2 
      if 0 < len(param3): 
       for param3 in params3: 
        summary['param3'] = param3 
        print summary 
      else: 
       print summary 
    else: 
     if 0 < len(params3): 
      for param3 in params3: 
       summary['param3'] = param3 
       print summary 
     else: 
      print summary 

нужны получить Dict с комбинациями непустых Params, выход Пример кода:

{'param3': 3, 'param1': 1} 
{'param3': 4, 'param1': 1} 
{'param3': 5, 'param1': 1} 
{'param3': 6, 'param1': 1} 
{'param3': 3, 'param1': 2} 
{'param3': 4, 'param1': 2} 
{'param3': 5, 'param1': 2} 
{'param3': 6, 'param1': 2} 

Как заменить пример кода для маленьких линий?

+1

что именно вы пытаетесь сделать, какие PARAMS? –

+1

Вы хотите все [комбинации] (https://docs.python.org/3/library/itertools.html#itertools.product) этих параметров? –

+0

Вы когда-нибудь играли в [code golf] (http://codegolf.stackexchange.com/)? – wnnmaw

ответ

0

Вы можете сделать это с помощью рекурсии:

def affich(params, summary = None): 
#print(params, summary) 
if len(params) == 0: 
    print summary 
else: 
    if summary is None: summary = {} 
    name, pars = params[0] 
    if len(pars) == 0: 
     affich(params[1:], summary) 
    else: 
     for p in pars: 
      cur[name] = p 
      affich(params[1:], summary) 

affich((('params1', [1, 2]), ('params2', []), ('params3', [3, 4, 5, 6]), ('params5', [7, 8])) 

дает:

{'params5': 7, 'params1': 1, 'params3': 3} 
{'params5': 8, 'params1': 1, 'params3': 3} 
{'params5': 7, 'params1': 1, 'params3': 4} 
{'params5': 8, 'params1': 1, 'params3': 4} 
{'params5': 7, 'params1': 1, 'params3': 5} 
{'params5': 8, 'params1': 1, 'params3': 5} 
{'params5': 7, 'params1': 1, 'params3': 6} 
{'params5': 8, 'params1': 1, 'params3': 6} 
{'params5': 7, 'params1': 2, 'params3': 3} 
{'params5': 8, 'params1': 2, 'params3': 3} 
{'params5': 7, 'params1': 2, 'params3': 4} 
{'params5': 8, 'params1': 2, 'params3': 4} 
{'params5': 7, 'params1': 2, 'params3': 5} 
{'params5': 8, 'params1': 2, 'params3': 5} 
{'params5': 7, 'params1': 2, 'params3': 6} 
{'params5': 8, 'params1': 2, 'params3': 6} 
+0

Спасибо! Это кратчайшее решение –

0
>>> import itertools  
>>> params1 = [1,2] 
>>> params2 = [None] 
>>> params3 = [3,4,5,6] 
>>> # ... 
>>> params5 = [7,8] 
>>> print [x for x in itertools.product(params1, params2, ... , params5)] 
[(1, None, 3), (1, None, 4), (1, None, 5), (1, None, 6), (2, None, 3), (2, None, 4), (2, None, 5), (2, None, 6)] 
+0

да, это я буду использовать, если нет другой код не может найти –

Смежные вопросы