2016-05-02 6 views
1
l = ['A', 'B', 'C', 'D'] 

すべての組み合わせを順番に取得したいと考えています。だから、私は何をしようとしたことはある順番に組み合わせを作り出す最も良い方法は何ですか?

['ABCD', 'ABC', 'AB', 'A', 'BCD', 'BC', 'B', 'CD', 'C', 'D'] 

、のような出力が...

>>> o = set() 
>>> for i, j in enumerate(l): 
    o.add(''.join(l[:i])) 
    o.add(''.join(l[i:])) 


>>> 
>>> o 
set(['', 'ABCD', 'AB', 'D', 'BCD', 'CD', 'ABC', 'A']) 

になります。しかし、それはBCをミス。 itertools.combinationsも試しましたが、注文に関係なくすべての可能な組み合わせが提供されています。

+0

正確に言えば、「B」、「C」、「BC」がありません。 – Antonio

+0

@Antonio ??追加した。 –

+0

あなたの質問は[this](http://stackoverflow.com/q/17434070/2436175)のようですが、すぐに出力が出ますか? – Antonio

答えて

0

は、私はすべての組み合わせを使用すると、空の組み合わせを無視したい場合は、N-1 nは、元の文字列の長さである、(1から始まり^ 0と2の間のバイナリ名にマップすることを指摘したいと思います。ABCDがあります1111年、ABCは。

は、それらの値を生成し、マッピングを行うように1110で、そして。同じものを見て

もう一つの方法は、ABCDのためのすべての組み合わせは、BCDおよびすべてのそれらの組み合わせのためのすべての組み合わせでありますAを前に付ける。

4

リストの連続したサブセグメントだけを探している場合は、開始位置と終了位置の可能な組み合わせを決定し、一致するスライスを生成する。 endの位置はstartに依存しているので、itertoolsのいずれかの関数でこれを行う方法はないとは思います。

def comb_in_order(lst): 
    for start in range(0, len(lst)): 
     for end in range(len(lst), start, -1): 
      yield lst[start:end] 

例:

>>> [''.join(c) for c in comb_in_order(['A', 'B', 'C', 'D'])] 
['ABCD', 'ABC', 'AB', 'A', 'BCD', 'BC', 'B', 'CD', 'C', 'D'] 

あなた追加条件でitertools.productを使用することができますが、この方法は、あなたがとにかく除外される多くの組み合わせを反復処理し、結果の順序があります少し異なる:

>>> [''.join(lst[s:e+1]) for s,e in itertools.product(range(len(lst)), repeat=2) if s <= e] 
['A', 'AB', 'ABC', 'ABCD', 'B', 'BC', 'BCD', 'C', 'CD', 'D'] 
関連する問題