7

1 から 8 までの番号が付けられた 8 つのオブジェクトのリストがあるとします。

オブジェクトは 3 つのボックスに入れられます。1 つのボックスに 3 つ、別のボックスに 3 つ、最後のボックスに 2 つです。数学的には、これを行う方法は 8C3*5C3=560 通りあります。そこに560個のアイテムをループしたい。Pythonでそうする方法はありますか?

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

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

この目的では、 と は同じと見なされる['12','345','678']ことに注意してください。['12','354',876']

このリストを 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)
4

3 に答える 3

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']
于 2013-05-02T05:58:41.753 に答える
-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']
于 2013-05-02T05:24:08.197 に答える