[PYTHON] dictionnaire de liste, tous les assemblages
Répondre à la discussion
Affichage des résultats 1 à 15 sur 15

[PYTHON] dictionnaire de liste, tous les assemblages



  1. #1
    DavianThule95

    [PYTHON] dictionnaire de liste, tous les assemblages


    ------

    Bonjour,

    Dans un programme que j'écris, je suis confronté à un problème :
    J'ai un dictionnaire qui contient des listes de caractères, et j'aimerais mettre dans une liste toutes les chaines de caractères potentiellement formées.

    Voici un exemple :
    Code:
    dictionnaire_liste = {0:['a', 'd', 'u'], 1:['e', 'a', 'j', 'h'], 2:['k', 'l'], 3:['o', 'u', 'h']}
    
    #Je voudrais pouvoir inscire dans list_string toutes les séquences possibles. Ici, la première lettre de chaque chaine pourrait être a,d,u.
    #Sa seconde : e,a,j,h...etc
    #Pour avoir par exemple la chaine 'uekh' ou encore 'ahlo'.
    
    list_string = ['aeko', 'aalu', 'djku'....]
    Je ne vois pas du tout comment coder ça, sachant que le nombre de clefs dans le dictionnaire initial varie.

    Merci d'avance.

    -----
    Je dis ça je dis rien mais j'le dis quand même.

  2. #2
    f.oreste

    Re : [PYTHON] dictionnaire de liste, tous les assemblages

    fait une liste par clef de ton dico (et oublie la forme dico)

    def permut():
    L1,L2,L3,L4,Lout = [x,x,x,x,x],[x,x,x,x,x],[x,x,x,x,x],[x,x,x,x,x,x],[]
    nx=""
    dic = [L1,L2,L3,L4]

    for i in dic:
    for a in i:
    nx += a
    nx += i
    Lout.append(nx);nx=""
    return Lout

    a = permut()
    print(a)

    en gros, avec cette forme et de bonne liste de base bien formé, et en tripatouillant un peu (sous python3.x) tu devrais t'en sortir

  3. #3
    DavianThule95

    Re : [PYTHON] dictionnaire de liste, tous les assemblages

    Excusez-moi, je n'ai pas bien compris, et j'utilise python 2.7 (Je ne met pas à jour parce que j'ai beaucoup de programmes qu'il faudrait alors mettre à jour.)
    Pourriez-vous mettre les balises CODE et les indentations ?
    Je dis ça je dis rien mais j'le dis quand même.

  4. #4
    DavianThule95

    Re : [PYTHON] dictionnaire de liste, tous les assemblages

    J'ai écris un code qui marche à peu près, mais je suis confronté à un autre problème, il n'essaie pas toutes les possibilités pour la première sous-liste.

    Voilà le code :
    Code:
    list = [['a', 'f'], ['b'], ['c', 'g'], ['d', 'g', 'u']]
    
    def permutation(list):
        """
        permutation(list) => list of permutations
        Returns every possible permutations.
        """
        
        #We set the list which in will be saved every permutations.
        list_permutation = []
        len_list = len(list)
        indexes = [0]*len_list
        
        #We calculate the number of permutations and the number of permutations 
        #for each sub list.
        number_permutation = 1
        for sub_list in list:
            number_permutation *= len(sub_list)
        
        
        #Now, we set the barrier which indicate when the program must take the next 
        #character of the list.
        sub_list_permutations_barrier = [1] * len_list
        sub_list_permutations_barrier = [6 , 6, 3, 1]
            
        
        
        
        iter = 0
        
        #We have calculated, the number of permutations. Then we will create 
        #a new permutation number_permutation times.
        for number in range(number_permutation):
            print "\n\n[number = %u]\n" % number
            
            #The string which will contain the permutation.
            permutation = ""
            
            
            for index, sub_list in enumerate(list):
                index_char = indexes[index] % len(sub_list)
                permutation += sub_list[index_char]
                iter += 1
                moment_to_permut = iter % sub_list_permutations_barrier[index]
                
                
                print "\n[index = %u][sub_list = %s]" % (index, sub_list)
                print "[index_char = %u modulo %u]" % (indexes[index], len(sub_list))
                print "[permutation = %s]" % permutation
                print "[iter = %u]" % iter
                print "[moment_to_permut = %u]" % moment_to_permut
                
                if (moment_to_permut == 0):
                    indexes[index] += 1
                
                
                
            list_permutation += [permutation]
            
        return list_permutation
    
    
    print permutation(list)
    Je ne vois pas ce qui ne marche pas
    Je dis ça je dis rien mais j'le dis quand même.

  5. A voir en vidéo sur Futura
  6. #5
    CM63

    Re : [PYTHON] dictionnaire de liste, tous les assemblages

    Bonsoir,

    Il n'y aurait pas moyen de le faire en récursif? Juste pour voir le principe.
    PS : Ah non, ça ne marche pas, je n'avais pas compris le problème, je viens de le comprendre.
    Dernière modification par CM63 ; 30/06/2017 à 22h09.

  7. #6
    CM63

    Re : [PYTHON] dictionnaire de liste, tous les assemblages

    Pourquoi une partie de ton code est anglais? Il n'est pas de toi? Et pourquoi il parle de permutations? Ce n'est pas un problème de permutation.

  8. #7
    f.oreste

    Re : [PYTHON] dictionnaire de liste, tous les assemblages

    dsl les indentations ne sont pas passé.

    Citation Envoyé par f.oreste Voir le message
    fait une liste par clef de ton dico (et oublie la forme dico)

    def permut():
    ___L1,L2,L3,L4,Lout = [x,x,x,x,x],[x,x,x,x,x],[x,x,x,x,x],[x,x,x,x,x,x],[]
    ___nx=""
    ___dic = [L1,L2,L3,L4]

    ___for i in dic:
    ______for a in i:
    ______nx += a
    ___nx += i
    ___Lout.append(nx);nx=""

    ___return Lout

    a = permut()
    print(a)

    en gros, avec cette forme et de bonne liste de base bien formé, et en tripatouillant un peu (sous python3.x) tu devrais t'en sortir

  9. #8
    JPL
    Responsable des forums

    Re : [PYTHON] dictionnaire de liste, tous les assemblages

    Au lieu de ce bricolage de présentation, utilise la balise code.
    Rien ne sert de penser, il faut réfléchir avant - Pierre Dac

  10. #9
    DavianThule95

    Re : [PYTHON] dictionnaire de liste, tous les assemblages

    CM63 : Si le code est de moi, mais j'ai pris l'habitude de coder en anglais, et je parle de permutation parce que je vois pas d'autre mot pour parler de ce que fais le programme.
    Je dis ça je dis rien mais j'le dis quand même.

  11. #10
    DavianThule95

    Re : [PYTHON] dictionnaire de liste, tous les assemblages

    JPL : En parlant de balise code, ce serait très utile s'il était possible d'intégrer des balises différentes pour chaque langage (ou du moins les principaux), pour augmenter la lisibilité du code (avec les couleurs pour chaque type d'objet).
    Je dis ça je dis rien mais j'le dis quand même.

  12. #11
    CM63

    Re : [PYTHON] dictionnaire de liste, tous les assemblages

    Bonjour,

    Ok, je comprends.
    Personnellement je chercherais plutôt à utiliser les itérateurs sur les listes, mais est-ce que tu as le droit? Est-ce que c'est un exercice scolaire (où tu ne peux utiliser que ce qui a été vu en cours) ou un projet personnel (où tu peux tout faire)?

    PS : il me semble que pour que les balise codes marchent, il faut utiliser des blancs plutôt que la tabulation.
    Dernière modification par CM63 ; 01/07/2017 à 08h36.

  13. #12
    CM63

    Re : [PYTHON] dictionnaire de liste, tous les assemblages

    Mon PC sous Linux est tombé en panne (son écran) et donc je n'ai plus Python, je ne peux pas faire l'essai. Je vais voir si je peux trouver un moyen de récupérer Python sur mon portable sous Windows.
    Merci de répondre à la question ci-dessus, selon qu'il s'agisse d'un exercice de formation ou pas, nous ne répondons pas de la même façon. Nous évitons de "donner la solution" à l'étudiant, car ce n'est pas le but, alors que si c'est un problème personnel, c'est différent, je n'hésiterai pas à donner la solution, à "traiter le problème".

  14. #13
    DavianThule95

    Re : [PYTHON] dictionnaire de liste, tous les assemblages

    Alors en fait, c'est juste un problème personnel, (j'essaie à la base de décrypter le chiffre de Vigenère) et à un moment, le programme enregistre dans une liste de toute les premières lettres possibles de la clef, toutes les secondes lettres, toutes les troisièmes...
    Il faut ensuite tester toutes les combinaisons pour trouver la clef. C'est pour créer toutes les combinaisons que j'ai écris cette fonction (je pourrais d'ailleurs l'appeler combinaison(list) peut-être).

    Alors j'ai réussi à faire marcher mon code, mais j'ai pas compris comment. Mais ça marche => Si quelqu'un comprenait, ce serait sympa d'expliquer.
    Voilà le code, pour ceux qui seraient confrontés au même problème :
    Code:
    def permutation(list):
        """
        permutation(list) => list of permutations
        Returns every possible permutations.
        """
        
        #We set the list which in will be saved every permutations.
        list_permutation = []
        len_list = len(list)
        indexes = [0]*len_list
        
        #We calculate the number of permutations and the number of permutations 
        #for each sub list.
        number_permutation = 1
        for sub_list in list:
            number_permutation *= len(sub_list)
        
        #Now, we set the barrier which indicate when the program must take the next 
        #character of the list. When the barrier is reached, the program take the 
        #next value of the current sublist.
        sub_list_permutations_barrier = []
        
        local_number_permutation = number_permutation
        for index, sub_list in enumerate(list):
            local_number_permutation /= len(sub_list)
            sub_list_permutations_barrier += [local_number_permutation]
        sub_list_permutations_barrier[0] += 1
        
        #We initiate the value of the iteration.
        iter = 0
        
        #We have calculated, the number of permutations. Then we will create 
        #a new permutation number_permutation times.
        for number in range(number_permutation):
            
            #We will assemble the character into one string: The current permutation.
            permutation = ""
            
            #We take the character which fulfill conditions.
            for index, sub_list in enumerate(list):
                iter += 1
                index_char = indexes[index] % len(sub_list)
                permutation += sub_list[index_char]
                
                #If the variable iter modulo barrier is equal to zero, then the next
                #character used will be the next in the sublist.
                moment_to_permut = iter % sub_list_permutations_barrier[index]
                if (moment_to_permut == 0):
                    indexes[index] += 1
            
            #We add the created permutation to the list_permutation.
            list_permutation += [permutation]
            
        return list_permutation
    Je dis ça je dis rien mais j'le dis quand même.

  15. #14
    JPL
    Responsable des forums

    Re : [PYTHON] dictionnaire de liste, tous les assemblages

    Citation Envoyé par DavianThule95 Voir le message
    JPL : En parlant de balise code, ce serait très utile s'il était possible d'intégrer des balises différentes pour chaque langage (ou du moins les principaux), pour augmenter la lisibilité du code (avec les couleurs pour chaque type d'objet).
    Nous n’avons pas la main sur ce type de modification. Il y a actuellement Code, HTLM et PHP. De toute façon l’objectif sur lequel travaillent ceux qui développent les fonctionnalités du site est de passer sur un support meilleur que vBulletin. Apparemment la migration de l’un vers l’autre en conservant tous les paramétrages actuels n’est pas une mince affaire. Donc il n’y aura aucune amélioration sur la version actuelle, ce serait un investissement de temps improductif, mais je comprends l’intérêt de la demande.
    Rien ne sert de penser, il faut réfléchir avant - Pierre Dac

  16. #15
    f.oreste

    Re : [PYTHON] dictionnaire de liste, tous les assemblages

    évite d'employer(n'emploie jamais en fait) les mots réservé (list et iter dans ton code)

    un "if" ne demande comme en javascript ou PHP d'être suivit de parenthèse...

    sinon les commentaires de ton code alourdissent un peu celui-ci, # tu commenterais en fin de ligne ça serait plus sympas,


    sinon pour comprendre, il faudrait que tu fournissent une liste type devant-être "permuté" par ton programme, car je vois pas trop ce que tu veux "vraiment faire avec"

Discussions similaires

  1. Python : Inversion dictionnaire
    Par Charlycop dans le forum Programmation et langages, Algorithmique
    Réponses: 2
    Dernier message: 04/04/2016, 12h06
  2. Python : tracer l'histogramme d'un dictionnaire
    Par barbbatruc dans le forum Programmation et langages, Algorithmique
    Réponses: 2
    Dernier message: 30/03/2016, 09h36
  3. Fonction et liste Python
    Par Lionelno dans le forum Programmation et langages, Algorithmique
    Réponses: 10
    Dernier message: 26/01/2016, 09h27
  4. Python: liste de listes
    Par BienZen dans le forum Programmation et langages, Algorithmique
    Réponses: 3
    Dernier message: 14/09/2014, 10h59
  5. python POO - dictionnaire
    Par invite2ace8786 dans le forum Électronique
    Réponses: 1
    Dernier message: 16/06/2009, 11h12