ホームページ > バックエンド開発 > Python チュートリアル > 重複を避けて一意の値を持つ順列を生成するにはどうすればよいですか?

重複を避けて一意の値を持つ順列を生成するにはどうすればよいですか?

DDD
リリース: 2024-12-06 04:25:15
オリジナル
516 人が閲覧しました

How to Generate Permutations with Unique Values, Avoiding Duplicates?

一意の値による順列の生成

itertools.permutations() 関数を使用して生成された順列は、要素を値ではなく位置に基づいて一意として扱います。その結果、同じ値を持つ要素の順序のみが異なる重複が生成される可能性があります。

解決策

重複を回避するには、次のアプローチの使用を検討してください。

  1. 値を明示的に一意として処理する sympy ライブラリの multiset_permutations() イテレータを利用します。位置に関係なく。
  2. または、各一意の値の頻度を追跡する非反復アルゴリズムを実装します。
def unique_permutations(elements):
    """Generate permutations with unique values."""
    elements = sorted(elements)
    result = []
    counts = {}
    prev_element = None
    for element in elements:
        if element != prev_element:
            counts[element] = 1
        else:
            counts[element] += 1
        result.extend(combine(element, counts))
        prev_element = element
    return result

def combine(element, counts):
    """Combine element with unique counts to form permutations."""
    permutations = []
    if sum(counts.values()) == 1:
        return [tuple([element])]
    for other_element, count in counts.items():
        if element == other_element:
            count -= 1
        permutations.extend([*tuple([element]), *sublist] for sublist in combine(other_element, count))
    return permutations
ログイン後にコピー

>>> list(unique_permutations([1, 1, 2]))
[[1, 1, 2], [1, 2, 1], [2, 1, 1]]
ログイン後にコピー

以上が重複を避けて一意の値を持つ順列を生成するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート