[解決済み] 一意な値を持つ並べ換え
質問
itertools.permutationsは、その要素がその値ではなく、その位置に基づいてユニークとして扱われる場所を生成します。だから基本的に私はこのような重複を避けたい。
>>> list(itertools.permutations([1, 1, 1]))
[(1, 1, 1), (1, 1, 1), (1, 1, 1), (1, 1, 1), (1, 1, 1), (1, 1, 1)]
私の場合、順列の量が多すぎるため、後からフィルタリングすることは不可能です。
誰かこのための適切なアルゴリズムを知りませんか?
ありがとうございました。
EDITです。
私が基本的に欲しいのは以下のものです。
x = itertools.product((0, 1, 'x'), repeat=X)
x = sorted(x, key=functools.partial(count_elements, elem='x'))
というのは
sorted
はリストを作成し、itertools.product の出力は大きすぎるからです。
すみません、実際の問題を記述すべきでした。
どのように解決するのですか?
class unique_element:
def __init__(self,value,occurrences):
self.value = value
self.occurrences = occurrences
def perm_unique(elements):
eset=set(elements)
listunique = [unique_element(i,elements.count(i)) for i in eset]
u=len(elements)
return perm_unique_helper(listunique,[0]*u,u-1)
def perm_unique_helper(listunique,result_list,d):
if d < 0:
yield tuple(result_list)
else:
for i in listunique:
if i.occurrences > 0:
result_list[d]=i.value
i.occurrences-=1
for g in perm_unique_helper(listunique,result_list,d-1):
yield g
i.occurrences+=1
a = list(perm_unique([1,1,2]))
print(a)
の結果です。
[(2, 1, 1), (1, 2, 1), (1, 1, 2)]
EDIT(これがどう動くか)。
上記のプログラムを、長くても読みやすいように書き直しました。
私は通常、何かがどのように動作するかを説明するのに苦労していますが、試させてください。 これがどのように動作するかを理解するためには、繰り返しのあるすべての順列を得る、似ているがより単純なプログラムを理解する必要があります。
def permutations_with_replacement(elements,n):
return permutations_helper(elements,[0]*n,n-1)#this is generator
def permutations_helper(elements,result_list,d):
if d<0:
yield tuple(result_list)
else:
for i in elements:
result_list[d]=i
all_permutations = permutations_helper(elements,result_list,d-1)#this is generator
for g in all_permutations:
yield g
このプログラムは明らかにもっと単純である。 dはpermutations_helperのdepthを表し、2つの関数を持っている。1つは再帰的アルゴリズムの停止条件であり、もう1つは渡される結果リストのための関数である。
各結果を返す代わりに、それを降伏させます。もし関数/演算子がなかったら
yield
がなかったら、停止条件の時点で結果を何らかのキューにプッシュしなければならないでしょう。しかし、この方法では、いったん停止条件が満たされると、結果は呼び出し元までのすべてのスタックを介して伝搬される。これが
for g in perm_unique_helper(listunique,result_list,d-1): yield g
のように、それぞれの結果は呼び出し元まで伝搬されます。
元のプログラムに戻ります。
一意な要素のリストがあります。各要素を使用する前に、result_listにプッシュできる要素がまだいくつあるか確認する必要があります。このプログラムでの作業は
permutations_with_replacement
. 違いは、各要素はperm_unique_helperにある回数以上繰り返すことができないことです。
関連
-
[解決済み] 列の値に基づいてDataFrameから行を選択するにはどうすればよいですか?
-
[解決済み] 環境変数の値にアクセスする方法
-
[解決済み] pipでPythonの全パッケージをアップグレードする方法
-
[解決済み] NaN値をチェックするにはどうすればよいですか?
-
[解決済み] リストのすべての並べ換えを生成するには?
-
[解決済み] PythonでのAWS Lambdaのインポートモジュールエラー
-
[解決済み] python-requests モジュールからのすべてのリクエストをログに記録します。
-
[解決済み] Flask でグローバル変数はスレッドセーフか?リクエスト間でデータを共有するには?
-
[解決済み] PythonのRequestsモジュールを使ってWebサイトに "ログイン "するには?
-
[解決済み] Django filter queryset __in for *every* item in list
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] SQLAlchemy: 日付フィールドをフィルタリングする方法は?
-
[解決済み] オブジェクトのリストに特定の属性値を持つオブジェクトが含まれているかどうかをチェックする
-
[解決済み] あるオブジェクトが数であるかどうかを確認する、最もパイソン的な方法は何でしょうか?
-
[解決済み] Cythonのコードを含むPythonパッケージはどのように構成すればよいのでしょうか?
-
[解決済み] subprocess.run()の出力を抑制またはキャプチャするには?
-
[解決済み] Django で全てのリクエストヘッダを取得するにはどうすれば良いですか?
-
[解決済み] Flask でグローバル変数はスレッドセーフか?リクエスト間でデータを共有するには?
-
[解決済み] PySparkでデータフレームのカラムをString型からDouble型に変更する方法は?
-
[解決済み] Pythonでランダムなファイル名を生成する最良の方法
-
[解決済み] PythonのRequestsモジュールを使ってWebサイトに "ログイン "するには?