2013-05-02 10 views
5

私は8つのオブジェクトのリストを持っており、番号は1から8です。8つのオブジェクトを3つのグループにまとめるPythonループ3-3-2

オブジェクトは、1つのボックスに3つ、別のボックスに3つ、最後のボックスに2つの3つのボックスに入れられます。数学では、これを行うには8C3 * 5C3 = 560通りあります。私はそこに560項目をループしたい。 Pythonでこれを行う方法はありますか? ['12','345','678']['12','354',876']は、この目的のために同じと考えられていることを

list=['12','345',678'], ['12','346','578'], ..., etc. 

注:

結果は次のようになります。

forループを作成したいと思います。 Pythonでこれを行う方法はありますか?

ここに私が得た解決策がありますが、それは醜いようです。

import itertools 
for c1,c2 in itertools.combinations(range(8),2): 
      l2=list(range(8)) 
      l2.pop(c2) 
      l2.pop(c1) 
      for c3,c4,c5 in itertools.combinations(l2,3): 
       l3=l2[:] 
       l3.remove(c5) 
       l3.remove(c4) 
       l3.remove(c3) 
       c6,c7,c8=l3 
       print(c1,c2,c3,c4,c5,c6,c7,c8) 
+1

どのように解決しようとしましたか?どのようなコードですか? – snapshoe

+0

itertools http://docs.python.org/2/library/itertools.htmlで独自のロジックを追加できます。 – Pramod

+0

私は本当にあなたの質問を理解していないと言わなければならない。 –

答えて

2
def F(seq, parts, indexes=None, res=[], cur=0): 
    if indexes is None: # indexes to use for combinations 
     indexes = range(len(seq)) 

    if cur >= len(parts): # base case 
     yield [[seq[i] for i in g] for g in res] 
     return  

    for x in combinations(indexes, r=parts[cur]): 
     set_x = set(x) 
     new_indexes = [i for i in indexes if i not in set_x] 
     for comb in F(seq, parts, new_indexes, res=res + [x], cur=cur + 1): 
      yield comb 

it = F('12345678', parts=(2,3,3)) 
for i in range(10): 
    print [''.join(g) for g in next(it)] 

['12', '345', '678'] 
['12', '346', '578'] 
['12', '347', '568'] 
['12', '348', '567'] 
['12', '356', '478'] 
['12', '357', '468'] 
['12', '358', '467'] 
['12', '367', '458'] 
['12', '368', '457'] 
['12', '378', '456'] 

もう一つの例:

for c in F('1234', parts=(2,2)): 
    print [''.join(g) for g in c] 

['12', '34'] 
['13', '24'] 
['14', '23'] 
['23', '14'] 
['24', '13'] 
['34', '12'] 
+0

私はIndexErrorを取得しています:コードを実行しているときにリストのインデックスが範囲外です。 – Pramod

+0

偉大な答え、私はなぜこれがupvotedされていないのか分からない! – Werner

-1

lはこの例では文字列では、8つのオブジェクトのリストであろう:

l = ["O1","02","03","04","04","06","07","08"] 
for group in [l[:3],l[3:6],l[6:]]: #get 3 slices of the list into 3's and a 2 
    print(group) 

が生成する:

>>> 
['O1', '02', '03'] 
['04', '04', '06'] 
['07','08'] 
0

あなただけ(前の回答に示すように)、すべての8つの値を並べ替えることができます。そのために このprevious answerを使用してください(次のコードにも記載されています)。

次に、各組み合わせをタプルとして割り当てます。これらのタプルは、ハッシュして一意であるため、注文する必要があるため一意に比較することができます。

def all_perms(elements): 
    if len(elements) <=1: 
     yield elements 
    else: 
     for perm in all_perms(elements[1:]): 
      for i in range(len(elements)): 
       #nb elements[0:1] works in both string and list contexts 
       yield perm[:i] + elements[0:1] + perm[i:] 


v = [1,2,3,4,5,6,7,8] 

a = {} 
for i in all_perms(v): 
    k = (tuple(sorted([i[0],i[1]])) , tuple(sorted([i[2],i[3],i[4]])) , tuple(sorted([i[5],i[6],i[7]]))) 

    if k not in a: 
     a[k] = [str(i[0])+str(i[1]), str(i[2])+str(i[3])+str(i[4]), str(i[5])+str(i[6]) + str(i[7])] 

x = 0 
for i in a.values(): 
    print x, i 
    x+=1 

たとえば、8つの値について、これは560の組み合わせを示します。

+0

OPの順序ではありません(問題があるか分かりません) – jamylak

+0

OPの順序は何ですか? – eLRuLL

+0

何らかの理由で彼を削除しました。 – jamylak

関連する問題