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

Julia Discussion :

Problème avec dictionnaire


Sujet :

Julia

  1. #1
    Membre habitué
    Homme Profil pro
    Enseignant
    Inscrit en
    juillet 2014
    Messages
    52
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : Belgique

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Service public

    Informations forums :
    Inscription : juillet 2014
    Messages : 52
    Points : 156
    Points
    156
    Par défaut Problème avec dictionnaire
    Bonjour,

    Je suis en train de faire les exercices du livre Think Julia et dans l'exercice exercice 12-5

    J'utilise donc un dictionnaire et une fonction récursive:

    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
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
     
    # Lis le dictionnaire anglais
    words=[]
    for line in readlines("words.txt")
        push!(words,line)
    end
     
    # Transforme clé de dictionnaire pour augmenter la vitesse
    wordsDict = keys(Dict(lowercase(words[i]) => words[i] for i = 1:length(words)))
     
    function test_mot(mot,listAna,Dico)
        if mot ∉ Dico #(symbole not in)
            return []
        else
            if mot in keys(listAna)
                return listAna[mot]
            else
                mots=[]
     
                for i in 1:length(mot)
                    motcoupe = mot[1:i-1] * mot[i+1:end]
                    if motcoupe != ""
                        result = test_mot(motcoupe,listAna,Dico)
                        println(result,"->",typeof(result))
                        if length(result)>length(mots)
                            mots = result
                        end
                    end
                end
     
                insert!(mots,1,mot)
                listAna[mot]=mots
                return mots
            end
        end
     
    end
     
    function main()
        motsAnalyses=Dict()
        motsAnalyses["a"]=["a"]
        motsAnalyses["i"]=["i"]
        println("********************* NEW RUN *************************")
        println(test_mot("at",motsAnalyses,wordsDict))
        println(motsAnalyses)
    end
     
    main()
    Le main, c'est pour le debugging, malheureusement, je ne comprends pas pourquoi ma ligne de dictionnaire ["a"] est modifiée également par la fonction insert! (avec pushfirst! aussi), on dirait que mots n'est pas un tableau de chaînes mais un tableau de références vers le dictionnaire (un itérateur sur la valeur référencée par la clé sous forme de chaîne ?)

    Je ne demande pas la solution, j'essaie juste de comprendre.

    Bonne soirée.

  2. #2
    Membre habitué
    Homme Profil pro
    Enseignant
    Inscrit en
    juillet 2014
    Messages
    52
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : Belgique

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Service public

    Informations forums :
    Inscription : juillet 2014
    Messages : 52
    Points : 156
    Points
    156
    Par défaut
    Bonjour à nouveau,

    Ne chercher plus, le code que je vous ai mis n'est pas exactement le même que celui que j'utilise, j'ai en effet créé un fichier word_2.txt qui contient le a et le I de l'exercice et là, j'ai problème de duplication par contre si j'utilise le code que j'ai modifié pour utiliser le word.txt en initialisant les entrés motsAnalyses["a"]=["a"] et motsAnalyses["i"]=["i"] ne sont pas modifiées. Mais par contre les entrées créées par la routine subissent le problème

    Je vais retravailler pas à pas ma routine sûrement mauvaise, car par exemple avec le mot "chat", j'obtiens ceci pour le tableau motsAnalyses :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Dict{Any,Any}("hat" => Any["chat", "cat", "hat", "ha", "at", "a"],"ha" => Any["chat", "cat", "hat", "ha", "at", "a"],"cat" => Any["chat", "cat", "hat", "ha", "at", "a"],"at" => Any["chat", "cat", "hat", "ha", "at", "a"],"a" => Any["chat", "cat", "hat", "ha", "at", "a"],"chat" => Any["chat", "cat", "hat", "ha", "at", "a"])
    Donc pas vraiment :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Dict{Any,Any}("hat" => Any["hat", "ha", "a"],"ha" => Any["ha", "a"],"cat" => Any["cat","at", "a"],"at" => Any["at", "a"],"a" => Any["a"],"chat" => Any["chat","hat", "ha", "a"])
    Si je laisse le code que je vous ai posté j'ai :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Dict{Any,Any}("hat" => Any["chat", "cat", "hat", "at"],"ha" => Any["ha"],"cat" => Any["chat", "cat", "hat", "at"],"at" => Any["chat", "cat", "hat", "at"],"a" => ["a"],"chat" => Any["chat", "cat", "hat", "at"],"i" => ["i"])
    Là, on voit que le "a" n'est pas mis dans la liste et qu'elle n'est pas bonne non plus.

    Allez retour au charbon.

  3. #3
    Membre habitué
    Homme Profil pro
    Enseignant
    Inscrit en
    juillet 2014
    Messages
    52
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : Belgique

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Service public

    Informations forums :
    Inscription : juillet 2014
    Messages : 52
    Points : 156
    Points
    156
    Par défaut modification du code
    Salut,

    J'ai modifié la fin de ma routine pour remplacer le insert! ou le pushfirst! par du code tout simple :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
      #insert!(mots,1,mot)
                x = [mot]
                for i in 1:length(mots)
                    push!(x,mots[i])
                end
                listAna[mot]=x
                return x
    Et bingo! Cela fonctionne parfaitement bien:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ********************* NEW RUN *************************
    ["chat", "hat", "at", "a"]
    Dict{Any,Any}("hat" => ["hat", "at", "a"],"ha" => ["ha", "a"],"cat" => ["cat", "at", "a"],"at" => ["at", "a"],"a" => ["a"],"chat" => ["chat", "hat", "at", "a"])
    Avec le debug, je vois que je renvoyais un iterable(), un tableau de tableau de string, donc les fonctions pushfirst! ou insert! ajoutait la réponse de la fonction à chaque tableau de string!

    Deux jours... quel boulet!

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

Discussions similaires

  1. Problème avec utilisation dictionnaire
    Par gdepotter dans le forum Général Python
    Réponses: 2
    Dernier message: 15/04/2019, 22h13
  2. [Python 2.X] Problème avec dictionnaire de listes
    Par lenouch dans le forum Général Python
    Réponses: 2
    Dernier message: 22/07/2016, 15h43
  3. [Python 2.X] Problème de surcharge avec dictionnaire
    Par MrFlash03 dans le forum Général Python
    Réponses: 6
    Dernier message: 21/09/2015, 17h14
  4. Problème avec la mémoire virtuelle
    Par Anonymous dans le forum CORBA
    Réponses: 13
    Dernier message: 16/04/2002, 16h10

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