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 :

Obtenir la liste des combinaisons de p éléments d une liste de n éléments?


Sujet :

Python

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 8
    Points : 7
    Points
    7
    Par défaut Obtenir la liste des combinaisons de p éléments d une liste de n éléments?
    Voilà mon problème . J'aimerai obtenir simplement toutes les combinaisons possibles (de p éléments) parmi une liste de n éléments . par exemple : soit la liste [ 1, "machin", [0, 1] ] pour laquelle je souhaite avoir la liste des combinaisons de deux éléments . En retour j'obtiendrais [[1, "machin"], [1, [0, 1]], ["machin", [0, 1]]] .

    Je suis débutant en python . Je fais du python pour un MOD d'un jeu (CivilisationIV) . De ce fait je n'ai pas accès aux extentions (bibliothèques) de python .

    J'ai reussi à obtenir ce que je voulais en recupérant la liste des indexs des combinaisons . J'ai préféré ne pas implémenter une fonction reccursive pour éviter une erreur du nombre de reccursion maximum . Voilà la fonction (qui ne marche pas pour p=0 ou 1 mais c'est sans importance ) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    def getCombi(p, n) :
            lResult = []
            lListPreCombi = []
            for iPass in range(n) :
                    if iPass <= n - p : lListPreCombi += [[n - 1 - iPass]]
                    for lPreCombi in lListPreCombi :
                            minVal = min(lPreCombi)
                            bResult = len(lPreCombi) == p-1
                            for i in range(n - 1 - iPass, minVal):
                                    combiTemp = [i] + lPreCombi
                                    if bResult :
                                            if not combiTemp in lResult : lResult.append(combiTemp)
                                    else :
                                            if not combiTemp in lListPreCombi : lListPreCombi.append(combiTemp)
            return lResult
    J'aimerai savoir s'il n'y a pas une fonction simple pour obtenir ce resultat ?

    Merci d'avance !

    Stéphane

  2. #2
    Expert éminent sénior
    Avatar de Guigui_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2002
    Messages
    1 864
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2002
    Messages : 1 864
    Points : 10 067
    Points
    10 067
    Par défaut
    tu peux regarder ce code ( http://python.developpez.com/sources...h#Combinatoire ) (mais je l'avais implémenter en récursif (y'a tout de même peu de chance de faire exploser la pile d'appel)

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 8
    Points : 7
    Points
    7
    Par défaut
    Ca m'apprendra a chercher un peu plus avant de poster , j'avais toujours reussi a trouver ce que je voulais depuis que je me suis inscrit sur ce forum . Magnifique fonction , Ce que j'imaginais comme fonction reccursive est loin de celle ci et aurait été probablement a la limite . Mais celle ci est parfaite !

    Merci beaucoup

    Stéphane

  4. #4
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 462
    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 462
    Points : 9 249
    Points
    9 249
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Il y a une solution plus simple, à défaut d'être élégante, rendue possible par les calculs en entier de Python (pas de limite sauf mémoire):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
    def fact(n):
        """Factorielle n (version non récursive)."""
        x=1
        for i in xrange(2,n+1):
            x*=i
        return x
     
    def permutation(n):
        """Permutation de n objets"""
        return fact(n)
     
    def arrangement(n,k):
        """Arrangement de n objets pris p a p."""
        return fact(n)/fact(n-k)
     
    def combinaison(n,k):
        """Combinaison de n objets pris p a p."""
        return fact(n)/(fact(k)*fact(n-k))
    Un expert est une personne qui a fait toutes les erreurs qui peuvent être faites, dans un domaine étroit... (Niels Bohr)
    Mes recettes python: http://www.jpvweb.com

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 8
    Points : 7
    Points
    7
    Par défaut
    Merci tyrtamos pour ton aide mais ce que je cherchais a faire n'etait pas de calculer le nombre de combinaisons possibles mais d'en obtenir la liste .

    Stéphane

  6. #6
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 462
    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 462
    Points : 9 249
    Points
    9 249
    Billets dans le blog
    6
    Par défaut
    Effectivement, toutes mes excuses!

    Tyrtamos
    Un expert est une personne qui a fait toutes les erreurs qui peuvent être faites, dans un domaine étroit... (Niels Bohr)
    Mes recettes python: http://www.jpvweb.com

  7. #7
    Membre éclairé
    Avatar de GnuVince
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2004
    Messages
    679
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2004
    Messages : 679
    Points : 803
    Points
    803
    Par défaut
    Il y a une façon assez simple d'obtenir les combinaisons d'une liste, regarde l'article de Wikipédia sur les powersets. Une fois que tu as ton powerset, tu peux simplement filtrer les élément de la longueur désirée.

  8. #8
    Futur Membre du Club
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 8
    Points : 7
    Points
    7
    Par défaut
    Je ne connaissais pas cette méthode . Merci de m'avoir pointé là dessus , ca fait plaisir d'apprendre . Mais je ne pense pas que je vais implémenter cela . Le nombre d'éléments du powerset est de 2^n et cela risque de ralentir ma fonction ( ou j'appele getCombi dans une double boucle ) , voire de poser un problème de limite .

    Merci ,

    Stéphane

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

Discussions similaires

  1. créer une hashmap pour chaque élément d'une liste
    Par lealeblanc dans le forum Collection et Stream
    Réponses: 3
    Dernier message: 30/05/2015, 16h23
  2. Réponses: 3
    Dernier message: 23/04/2010, 09h14
  3. Réponses: 3
    Dernier message: 18/03/2008, 21h55
  4. Réponses: 4
    Dernier message: 11/07/2007, 19h28
  5. Réponses: 7
    Dernier message: 28/06/2007, 11h08

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