2016-10-18 5 views
0

나는 명령 행에서 파싱 된 키와 가능한 값의 쌍을 나열했다. 예 :파이썬 2 차원 재귀

[('-a',['1','2','3']), ('-b',['1','2'])]

내 목표는 다음과 같이 조합을 생산하는 것입니다 :

prefix -a=1 -b=1 suffix 
prefix -a=1 -b=2 suffix 
prefix -a=2 -b=1 suffix 
prefix -a=2 -b=2 suffix 
prefix -a=3 -b=1 suffix 
prefix -a=3 -b=2 suffix 

문제가, 목록 길이 될 때문에 하위 목록에서 값을 수행 할 수 있습니다.

가능한 솔루션은 지금까지 내가 원하는 걸 제공하지 않습니다 쓴 재귀의 어떤 종류를 사용하는 것 :

def runner(args, comd=""): 
    for i in range(len(args)): 
     op, vals = args[i] 

     for val in vals: 
      comd = op + "=" + val + " " + runner(args[1:], comd) 

     if i == len(args) - 1: 
      print ("prefix " + comd + " suffix") 

    return comd 

답변

3

당신은이 목록의 cartesian product하고 싶어. 이를 위해 itertools.product()을 사용하십시오. 예를 들어 :

>>> my_list = [('-a',['1','2','3']), ('-b',['1','2'])] 
>>> from itertools import product 
>>> list(product(my_list[0][1], my_list[1][1])) 
[('1', '1'), ('1', '2'), ('2', '1'), ('2', '2'), ('3', '1'), ('3', '2')] 

그것은 모두 목록에서 tuple의 모든 조합의 list을 제공합니다.


지금, 당신의 문제에오고, 아래의 샘플 코드는 다음과 같습니다

my_list = [('-a',['1','2','3']), ('-b',['1','2'])] 
keys, value_list = zip(*my_list) 
for item in product(*value_list): 
    val_list = ['{}={}'.format(key, val) for key, val in zip(keys, item)] 
    print 'prefix {} suffix'.format(' '.join(val_list)) 

# Output: 
prefix -a=1 -b=1 suffix 
prefix -a=1 -b=2 suffix 
prefix -a=2 -b=1 suffix 
prefix -a=2 -b=2 suffix 
prefix -a=3 -b=1 suffix 
prefix -a=3 -b=2 suffix 

설명 :

zip([iterable, ...])는 i 번째 튜플에 포함 된 튜플의 목록을 반환 각 인수 시퀀스 또는 iterables의 i 번째 요소. 리턴 된리스트는 길이가 가장 짧은 인수 시퀀스의 길이로 절단됩니다. 예를 들어, 위의 코드에서 :

>>> keys, value_list = zip(*my_list) # zipping the unwrapped "my_list" 
>>> keys # value of keys 
('-a', '-b') 
>>> value_list # value of values_list 
(['1', '2', '3'], ['1', '2']) 

은 (맨 처음에 설명 된대로) 그 때 나는 values_list직교 제품을하고있는 중이 야 다시 keyszip과 직교 제품의 각 item을하고.

+1

a 및 b는 어디에 있습니까? 또한 수동으로 1000000 키/값 쌍으로 사전을 수동으로 색인 하시겠습니까? –

+0

코드가 OP 코드가 수행하는 작업을 수행하지 않으므로 일반 솔루션에 관계없이 올바른 솔루션을 제공하거나 대답을 삭제할 수 있습니다. –

+1

코드를 설명하는 것이 좋습니다. –