2014-10-27 57 views
-2

五个参数可以有各种len(包括空)。我为前三个参数写了很长的代码,对于更多的参数来说,它会重复更大的代码。如何最小化代码?python:字典中列表的组合,列表的大小不一

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 

需要得到与组合的非空参数,可以的示例代码输出字典:

{'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? – 2014-10-27 14:50:52

+1

你想要这些参数的所有[组​​合](https://docs.python.org/3/library/itertools.html#itertools.product)吗? – 2014-10-27 14:50:59

+0

你有没有玩过[code golf](http://codegolf.stackexchange.com/)? – wnnmaw 2014-10-27 14:51:09

回答

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

谢谢!这是最短的解决方案 – 2014-10-28 08:12:41

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

是的,这是我会用,如果没有其他代码无法找到 – 2014-10-28 08:07:19