Maison >développement back-end >Tutoriel Python >Comment générer des permutations avec des valeurs uniques, en évitant les doublons ?

Comment générer des permutations avec des valeurs uniques, en évitant les doublons ?

DDD
DDDoriginal
2024-12-06 04:25:15485parcourir

How to Generate Permutations with Unique Values, Avoiding Duplicates?

Génération de permutations avec des valeurs uniques

Les permutations générées à l'aide de la fonction itertools.permutations() traitent les éléments comme uniques en fonction de la position et non de la valeur. Par conséquent, il peut produire des doublons qui ne diffèrent que par l'ordre des éléments de même valeur.

Solution

Pour éviter les doublons, pensez à utiliser l'approche suivante :

  1. Utilisez l'itérateur multiset_permutations() de la bibliothèque sympy, qui gère explicitement les valeurs comme uniques, indépendamment de position.
  2. Vous pouvez également implémenter un algorithme non itératif qui suit la fréquence de chaque valeur unique :
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

Exemple

>>> list(unique_permutations([1, 1, 2]))
[[1, 1, 2], [1, 2, 1], [2, 1, 1]]

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn