隣接する等しい要素なしでリストのすべての順列を生成します
リストを並べ替えるとき a = [1,2,3,3,2,2,1] sorted(a) => [1, 1, 2, 2, 2, 3, 3] 結果のリストでは、等しい要素が常に隣接しています。 どうすれば反対のタスクを実行できますか?リストをシャッフルして、等しい要素が決して(またはできるだけまれに)隣接しないようにしますか? たとえば、上記のリストの場合、考えられる解決策の1つは次のとおりです。 p = [1,3,2,3,2,1,2] より正式には、リストが与えられると、ペアの数を最小化するリストaの順列pを生成しp[i]==p[i+1]ます。 リストは大きいため、すべての順列を生成してフィルタリングすることはできません。 ボーナス質問:そのようなすべての順列を効率的に生成する方法は? これは私がソリューションをテストするために使用しているコードです:https://gist.github.com/gebrkn/9f550094b3d24a35aebd UPD:多くの人が優れた回答を投稿したため、ここで勝者を選ぶのは難しい選択でした。@VincentvanderWeele、@デビッドEisenstat、@Coady、@ enrico.bacisと@srgerg完璧に可能な限り最高の順列を生成する機能を提供します。@tobias_kとDavidもボーナスの質問に答えました(すべての順列を生成します)。正しさの証明のためのDavidへの追加のポイント。 @VincentvanderWeeleのコードが最速のようです。