2016-10-18 12 views
0

私は、コマンドラインから解析されたキーと可能な値のリストのペアを持っています。例えば:Python 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

は、次の2つのリストの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番目のタプルが含まれているタプルのリストを返します。各引数シーケンスまたはiterableからの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

コードの説明が必要な場合があります。 –