IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

permutation de nombre sans doublon


Sujet :

Python

  1. #1
    Rédacteur
    Avatar de Neitsa
    Homme Profil pro
    Chercheur sécurité informatique
    Inscrit en
    Octobre 2003
    Messages
    1 041
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chercheur sécurité informatique

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 041
    Par défaut permutation de nombre sans doublon
    Bonjour,

    [Python 3.x]

    Problème:

    Je cherche à générer toutes les permutations d'un nombre donné:

    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    import itertools
     
    def get_all_perms(n):
        n_str = str(n)
        perms = [int(''.join(x)) for x in list(itertools.permutations(n_str))]
        return perms
     
    if __name__ == '__main__':
        perms = get_all_perms(123)
        print(perms)

    Output:
    [123, 132, 213, 231, 312, 321]
    Maintenant avec n=122

    [122, 122, 212, 221, 212, 221]
    Alors que je cherche plutôt à obtenir (donc: liste sans doublon):

    [122, 212, 221]
    Ce qui fonctionne avec ça:

    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    def get_all_perms(n):
        n_str = str(n)
        perms = [int(''.join(x)) for x in list(itertools.permutations(n_str))]
        out_perms = list()
        for perm in perms:
            if perm not in out_perms:
                out_perms.append(perm)
        return out_perms

    Mais ce dernier code me donne l’impression d'être suboptimal (deux listes utilisées, un parcours pour chaque liste, etc.).

    Est-il possible , à l'intérieur d'une 'list comprehension' d'ajouter une condition pour éviter qu'un élément soit ajouter s'il existe déjà dans la liste ?

    Quelqu'un aurait-il une idée pour un code propre concernant ce problème?

    Merci beaucoup

  2. #2
    Membre Expert
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    1 068
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 068
    Par défaut
    si l'ordre n'a pas d'importance : set()

  3. #3
    Expert confirmé
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 486
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 486
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Avec Python 2.7 et 3.x, on peut construire un "set comprehension" qui permet de tout faire d'un coup:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    import itertools
     
    n = 122
    perm = list({int(''.join(x)) for x in itertools.permutations(str(n))})
    print perm
    [122, 212, 221]
    Le "set comprehension" est fait par l'accolade et empêche les doublons sans autre test.

    Tyrtamos

  4. #4
    Rédacteur
    Avatar de Neitsa
    Homme Profil pro
    Chercheur sécurité informatique
    Inscrit en
    Octobre 2003
    Messages
    1 041
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chercheur sécurité informatique

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 041
    Par défaut
    Bonjour,

    Merci beaucoup pour vos réponses et la solution ! Je n'avais pas pensé au 'set'...


+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Toutes versions] Compter le nombre de cellules sans doublons avec une condition
    Par Mimita64 dans le forum Excel
    Réponses: 2
    Dernier message: 02/12/2012, 20h39
  2. [SWI Prolog] Permutation sans doublon
    Par Freiherr.K dans le forum Prolog
    Réponses: 1
    Dernier message: 01/12/2009, 21h59
  3. liste de nombres aléatoire sans doublon
    Par rudyhadoux2 dans le forum Langage
    Réponses: 10
    Dernier message: 14/09/2009, 18h30
  4. Réponses: 2
    Dernier message: 27/05/2007, 22h23
  5. Nombre aléatoire sans doublon
    Par Ardely dans le forum Delphi
    Réponses: 9
    Dernier message: 01/03/2007, 21h54

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo