2011-11-23 12 views
5

私はタイトルでフレーズこの質問をするより良い方法を見つけることができませんでした。できれば、編集してください。2次元リストからアイテムの可能な組み合わせをすべて得る方法

[['a',1],['a',2],['b',1],['b',2]] 

もリストの数:私はこのようなすべての可能な組み合わせを出してくれる機能が欲しい、今

a = [['a','b'],[1,2]] 

は、私はこのようなリストのリストを持っています事前に知られているか、または各サブリストの長さが事前に分かっているわけではありませんが、出てくるすべての組み合わせはすべてのサブリストから1つの項目を含むべきです。

答えて

11

あなたはitertools.product()が必要になります。

>>> list(itertools.product(*a)) 
[('a', 1), ('a', 2), ('b', 1), ('b', 2)] 
+0

、目の前にある*は、リストをアンパック:私は常に唯一の例のように、2つのサブリストを持っていた場合に働くだろうhttp://stackoverflow.com/a/2921893/4549682 – wordsforthewise

0

これは何(スヴェンが言及)itertools.product()がないことがあります。ここ

def combs(list1, list2): 
    results = [] 
    for x in list1: 
     for y in list2: 
      l.append([x,y]) 
    return results 
+0

'[[1,2]、[「A」、「B」]]、その後、あなたはこの関数に二つのサブリストを渡すと思いますが、これはそうではありません、リストにもあるかもしれません' [[ 'A'、 'B'、 'C​​']、[1,2]、[{}、[]、()]] '、今、私たちは、3つのサブリストを持っているので、私たちが必要とするだろうことはあなたの関数であります可変数のリストを掛け合わせます。 – bigblind

+0

ああ、私はあなたの例から、常にペアになると思っていました。私はより良い提案をしていない。 – Anko

0

combs_raccumは(次のリストをheadダイジェスト持つ再帰を使用したソリューションであり、ラインで)、次いで、太っaccum0生成するとtail(残りのリスト)と今太っACCUMと)「再帰」(自分自身を呼び出すaccum0combs_rへの各呼び出しは、それがすべて巻き戻しが終了するまで、新しい名前空間を追加するよう

は、メモリのヘビーユーザーである可能性があります。 Python内部でもっと知っている人がこれについてコメントしているかもしれません。

はプロローグ、私見を学ぶために支払います。不思議に思っています誰のため

def combs(ll): 
    if len(ll) == 0: 
     return [] 
    if len(ll) == 1: 
     return [[item] for item in ll[0]] 
    elif len(ll) == 2: 
     return lmul(ll[0], [[item] for item in ll[1]]) 
    else: 
     return combs_r(ll[1:], ll[0]) 

def combs_r(ll, accum): 
    head = ll[0] 
    tail = ll[1:] 
    accum0 = [] 
    accum0 = lmul(head, accum) 
    if len(tail) == 0: 
     return accum0 
    else: 
     return combs_r(tail, accum0) 

def lmul(head, accum): 
    accum0 = [] 
    for ah in head: 
     for cc in accum: 
      #cc will be reused for each ah, so make a clone to mutate 
      cc0 = [x for x in cc] 
      cc0.append(ah) 
      accum0.append(cc0) 
    return accum0 

sampleip = [['a','b','c'],[1,2], ['A', 'B']] 
sampleip2 = [['a','b','c'],[1,2]] 
sampleip1 = [['a','b','c']] 
sampleip0 = [] 
print combs(sampleip0) 
print combs(sampleip1) 
print combs(sampleip2) 
print combs(sampleip) 
関連する問題