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 :

toutes les permutations possible entre une valeur min et max sans redondances


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre très actif
    Femme Profil pro
    étudiante chercheuse
    Inscrit en
    Septembre 2013
    Messages
    274
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : étudiante chercheuse
    Secteur : Enseignement

    Informations forums :
    Inscription : Septembre 2013
    Messages : 274
    Par défaut toutes les permutations possible entre une valeur min et max sans redondances
    bonjour,
    étant donné une liste
    D=[1,3,5,6]
    je veux former toutes les permutations possible entre une valeur min 2 et le len(D)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sous_chaine=permutations(D,2..len(D))
    résultat souhaité :
    sous_chaine=[(1,3),(1,5),(1,6),(3,5),(3,6),(1,3,5),(1,3,6),(1,5,6)(3,5,6)(1,3,5,6),..]
    pour moi (1,3) et (3,1) est une redondance que je veux pas avoir !!! comment faire?

  2. #2
    Membre éclairé Avatar de nekcorp
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2006
    Messages
    592
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2006
    Messages : 592
    Par défaut
    Salut,

    As tu regardé du coté de itertools ? Je sais qu'il y a une méthode combinations qui permet de générer l'ensemble des combinaisons possible d'une liste.

  3. #3
    Membre très actif
    Femme Profil pro
    étudiante chercheuse
    Inscrit en
    Septembre 2013
    Messages
    274
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : étudiante chercheuse
    Secteur : Enseignement

    Informations forums :
    Inscription : Septembre 2013
    Messages : 274
    Par défaut
    Citation Envoyé par nekcorp Voir le message
    Salut,

    As tu regardé du coté de itertools ? Je sais qu'il y a une méthode combinations qui permet de générer l'ensemble des combinaisons possible d'une liste.
    oui ça marche j'ai fait une confusion entre permutations et combinaisons merci pour l'éclaircissement

  4. #4
    Membre très actif
    Femme Profil pro
    étudiante chercheuse
    Inscrit en
    Septembre 2013
    Messages
    274
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : étudiante chercheuse
    Secteur : Enseignement

    Informations forums :
    Inscription : Septembre 2013
    Messages : 274
    Par défaut
    Citation Envoyé par nekcorp Voir le message
    Salut,

    As tu regardé du coté de itertools ? Je sais qu'il y a une méthode combinations qui permet de générer l'ensemble des combinaisons possible d'une liste.
    j'ai fait comme ça , reste je veux qu'avec la meme structure former exemple (1,4) --> j'affecte dans density_sous_chaine la densité sous cette forme (0.5,0.4) respectivement et puis la somme (0.5+0.4) c'est à dire pour (1,4) -->(0.5,0.4) puis -->(0.9) , as tu une idée , j'ai pensé à groupby() et starmap() !!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     sous_chaine=[]
                                    density_sous_chaine=[]
                                    x=len(chaine_precedence)
                                    for j in range (2,x+1):
                                        for i in combinations(chaine_precedence,j):
                                            sous_chaine.append(i)
                                    print("sous_chaine",sous_chaine)
                                    for m in sous_chaine:
                                        for n in range (len(m)):
                                            density_sous_chaine.append(get_task_density(n)
                                    print("sous_chaine_density", density_sous_chaine)

  5. #5
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 754
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 754
    Par défaut
    Salut,

    Citation Envoyé par FATENMRABET Voir le message
    pour moi (1,3) et (3,1) est une redondance que je veux pas avoir !!! comment faire?
    Pourquoi utiliser permutations et vous plaindre d'un soucis que vous n'auriez pas avec combinations suggéré dans une discussion précédente?

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  6. #6
    Membre très actif
    Femme Profil pro
    étudiante chercheuse
    Inscrit en
    Septembre 2013
    Messages
    274
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : étudiante chercheuse
    Secteur : Enseignement

    Informations forums :
    Inscription : Septembre 2013
    Messages : 274
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    Salut,



    Pourquoi utiliser permutations et vous plaindre d'un soucis que vous n'auriez pas avec combinations suggéré dans une discussion précédente?

    - W
    t'as vu le code avec permutations?? , c'est avec combinations j'ai fait

  7. #7
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 754
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 754
    Par défaut
    Citation Envoyé par FATENMRABET Voir le message
    t'as vu le code avec permutations?? , c'est avec combinations j'ai fait
    C'est dans votre premier post et le titre de cette discussion est "toutes les permutations possible entre une valeur min et max sans redondances"
    Après si vous voulez ouvrir un nouveau sujet, il serait préférable de le faire dans un des forums de la rubrique algorithme...
    A vous de voir.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  8. #8
    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,

    Si l'exemple donné au 1er message est correct, ce n'est ni une permutation ni une combinaison mais "l'ensemble des parties d'un ensemble". Voir ici:
    https://fr.wikipedia.org/wiki/Ensemb...%27un_ensemble

    Je ne connais pas de fonction toute faite de Python qui fait ça (il y en a peut-être?), alors voici un petit code proposé:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    def partiesliste(seq):
        p = []
        i, imax = 0, 2**len(seq)-1
        while i <= imax:
            s = []
            j, jmax = 0, len(seq)-1
            while j <= jmax:
                if (i>>j)&1 == 1:
                    s.append(seq[j])
                j += 1
            p.append(s)
            i += 1 
        return p
    Il y a 2**n parties si n est le nombre total d'éléments de la liste initiale.

    Il y a une façon simple de retrouver la logique de ce calcul: avec un comptage binaire!
    Par exemple, avec la liste fournie: D=[1,3,5,6]:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    nbelem = len(D)
    for i in range(0,2**nbelem):
            print(bin(i)[2:].zfill(nbelem))
    Ce qui affiche:

    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
    0000
    0001
    0010
    0011
    0100
    0101
    0110
    0111
    1000
    1001
    1010
    1011
    1100
    1101
    1110
    1111
    Dans chacun de ces nombres, on ne prend les éléments de D (dans l'ordre) que s'il y a un "1". Par exemple, pour "0101", on obtient: [3,6].

    Exemple d'application de la fonction:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    D=[1,3,5,6]
     
    print("Nombre total de parties:", 2**len(D))
     
    R = partiesliste(D)
    print(R)
    Résultat:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Nombre total de parties: 16
    [[], [1], [3], [1, 3], [5], [1, 5], [3, 5], [1, 3, 5], [6], [1, 6], [3, 6], [1, 3, 6], [5, 6], [1, 5, 6], [3, 5, 6], [1, 3, 5, 6]]
    A noter que la liste vide fait partie du résultat. Et on voit bien que les listes identiques sauf l'ordre (comme [1,5] et [5,1]) ne comptent que pour un.

    Si on veut que la liste ne contienne que les parties avec 2 éléments ou plus, il suffit d'une condition:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    R2 = []
    for elem in R:
        if len(elem)>=2:
            R2.append(elem)
    print(R2)
    Ce qui donne:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [[1, 3], [1, 5], [3, 5], [1, 3, 5], [1, 6], [3, 6], [1, 3, 6], [5, 6], [1, 5, 6], [3, 5, 6], [1, 3, 5, 6]]
    Ce qui ressemble fort à ce qui est demandé.

  9. #9
    Membre très actif
    Femme Profil pro
    étudiante chercheuse
    Inscrit en
    Septembre 2013
    Messages
    274
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : étudiante chercheuse
    Secteur : Enseignement

    Informations forums :
    Inscription : Septembre 2013
    Messages : 274
    Par défaut
    merci beaucoup pour cette exemple ça aide beaucoup à comprendre de nouvelles truc , mais bon combinations fait l'affaire déjà

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

Discussions similaires

  1. toutes les combinaisons possible formant une valeur compris entre 2
    Par FATENMRABET dans le forum Général Python
    Réponses: 4
    Dernier message: 23/08/2020, 18h09
  2. Réponses: 31
    Dernier message: 29/09/2018, 23h41
  3. Réponses: 2
    Dernier message: 24/09/2018, 00h50
  4. [Python 3.X] Trouver toutes les associations possibles entre les valeurs de deux listes
    Par AdrienVH dans le forum Général Python
    Réponses: 7
    Dernier message: 11/05/2017, 16h40
  5. Procéder toutes les permutations possibles d'une liste
    Par supergrey dans le forum Mathématiques
    Réponses: 3
    Dernier message: 21/10/2011, 15h08

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