2

これを説明するのに苦労している間、ご容赦ください。私の数学はさび付いていて、コンピュータープログラミングを始めたばかりです。申し訳ありません!

3つのアイテムのリストがあるとします。このリストのアイテムのすべての可能な配置を見つけたいと思います。各配置は 3 つのアイテムで構成されています。

次に、まだ元のリストを使用して、リストのアイテムのすべての可能な配置を見つけたいと思います。ただし、配置が 2 つのアイテムで構成されることだけが必要です。

最後に、アレンジメントが 1 つのアイテムのみであることを除いて、同じことをもう一度やりたいと思います。

だから私は3を期待しています!+ 3!/1! + 3!/2!、または合計 15 のアレンジ。私のリストが[1、2、3]の場合、コードは次のようになります。

1, 2, 3
1, 3, 2
2, 1, 3
2, 3, 2
3, 1, 2
3, 2, 1

1, 2
1, 3
2, 1
2, 3
3, 1
3, 2

1
2
3

以下に記述したコードは、上に記述したことを実行できますが、長さ 3 のリストに対してのみです。「for」ループと「elif」ステートメントを追加することで、より長いリストを処理するようにコードを変更できますが、パターンを一般化する方法が必要です。任意の長さのリストに対して上記の種類の順列を取得するにはどうすればよいですか?

私の網羅的な列挙方法がこれを必要以上に複雑にしている可能性があると思います...他の方法について考え、解決策が見つかった場合は更新します。

def helperFunction(itemsList):

    fullPermutationsOutputList = []


    def fullPermutations(itemsList, iterations):

        for item1 in itemsList:
            if iterations == 2:
                if len([item1]) == len(set([item1])):
                    fullPermutationsOutputList.append((item1,))
            else:    
                for item2 in itemsList:
                    if iterations == 1:
                        if len([item1, item2]) == len(set([item1, item2])):
                            fullPermutationsOutputList.append((item1, item2))
                    else:
                        for item3 in itemsList:
                            if iterations == 0:
                                if len([item1, item2, item3]) == len(set([item1, item2, item3])):
                                    fullPermutationsOutputList.append((item1, item2, item3))

        if iterations == 0:                        
            fullPermutations(itemsList, iterations + 1)
        elif iterations == 1:
            fullPermutations(itemsList, iterations + 1)

    fullPermutations(itemsList, 0)
    return fullPermutationsOutputList
4

2 に答える 2

8

ただitertools.permutations。正確なアルゴリズムが必要な場合は、そのソースを調べることができます。

于 2012-06-14T20:24:07.983 に答える
0

これはあなたが望むことをします:https://stackoverflow.com/a/10784693/1419494

def perm(list_to_perm,perm_l,items,out):
            if len(perm_l) == items:
                out +=[perm_l]
            else:
                for i in list_to_perm:
                    if i not in perm_l:
                        perm(list_to_perm,perm_l +[i],items,out)


a = [1,2,3]
for i in range(1,len(a) +1):
    out = []
    perm(a,[],i,out)
    print out
于 2012-06-14T20:28:12.530 に答える