2016-04-08 1 views
1

[0.0,1.0,2.0,3.0,4.0]リストを2つの空でないリストに分割するすべての方法

私は5つの数字と2つのグループを左右に持っています。 各番号には2つの選択肢があります。左右に移動できます。 リスト[0,1,2,3,4]のすべてのパーティショニングを2つの空でない部分に含むリストが必要です。たとえば、[([0]、[1,2,3,4])、([0,1]、[2,3,4])、...]

(2^5 -2)/ 2パーティショニングの合計は問題ではなく、繰り返しはしたくありません。 (私のリストは、[1,2,3,4]だった場合)、私はこのような何かを望んでいん意味:私はitertools機能となしのすべてに見てきた

[] [1, 2, 3, 4] 
[1] [2, 3, 4] 
[2] [1, 3, 4] 
[1, 2] [3, 4] 
[3] [1, 2, 4] 
[1, 3] [2, 4] 
[2, 3] [1, 4] 
[1, 2, 3] [4] 
[4] [1, 2, 3] 
[1, 4] [2, 3] 
[2, 4] [1, 3] 
[1, 2, 4] [3] 
[3, 4] [1, 2] 
[1, 3, 4] [2] 
[2, 3, 4] [1] 
[1, 2, 3, 4] [] 

が動作するように見えます。


編集:リストのための [範囲のiについてI(16)]私は次のことを行う場合は、16個の要素を持っている、これは私が見たものである。

n = len(l)//2 + 1 
>>> xs = list(chain(*[combinations(l, i) for i in range(1, n)])) 
>>> pairs = [(list(x), list(set(l) - set(x))) for x in xs] 
>>> print len(pairs) 
    39202 
>>> (2**16-2)/2 
    32767 

実際には、 6つの要素を持つリストの場合にも機能しません。理由がわかりません...

この問題は、すべての偶数長リストで発生します。私は長さ2のリストをしようとすると、例えば、Iを得る:

[([0.0]、[1.0])、([1.0]、[0.0])]

答えて

3

ものがitertoolsであり、多分あなたはちょうど正しい場所を見ていないでしょう。ここで

はTEH codezです:

from collections import OrderedDict 
from itertools import chain, combinations 

def partition(L): 
    n = len(L)//2 + 1 
    xs = chain(*[combinations(L, i) for i in range(1, n)]) 
    pairs = (tuple(sorted([x, tuple(set(L) - set(x))])) for x in xs) 
    return OrderedDict.fromkeys(pairs).keys() 

出力:

>>> for pair in partition([1,2,3,4]): 
...  left, right = map(list, sorted(pair, key=len)) 
...  print left, right 
... 
[1] [2, 3, 4] 
[2] [1, 3, 4] 
[3] [1, 2, 4] 
[4] [1, 2, 3] 
[1, 2] [3, 4] 
[1, 3] [2, 4] 
[1, 4] [2, 3] 
+1

待ち、これは私が得たものである:[(0)、(1)、(2)、(3 (1,0)、(0,3)、(1,2)、(1,3)、(1,4)、(1,1)、 (2,3)、(2,4)、(3,4)]となる。各パーティションについて、リストL内のすべての要素を左また​​は右の2つのリストのいずれかにグループ化する必要があります。そして私はそのようなすべての分割を望んでいます。 – Jobs

+1

Like:[(左、右)、(左、右)、(左、右)...... [15個の要素を空でない2つのグループに分割する] ..] – Jobs

+0

編集されました。私はあなたが残りの部分を自分で把握できると思っていた...;) – wim

関連する問題