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

Calcul scientifique Python Discussion :

Exercice : Somme de deux dés


Sujet :

Calcul scientifique Python

  1. #1
    Candidat au Club
    Exercice : Somme de deux dés
    Bonjour ,

    Je bloque sur un exercice Python , voici l'énoncé : "En lançant une paire de dés, il y a 36 combinaisons possible (6 valeurs possibles pour le premier dé x 6 valeurs pour le deuxième). Cependant la somme des deux dés est plus intéressante que leur combinaison. Par exemple, il n’y a qu’une combinaison qui produit la somme de 2 = 1 + 1, deux combinaisons qui produisent la somme de 3 = 1 + 2 = 2 + 1, trois combinaisons qui produisent la somme de 4 = 1 + 3 = 2 + 2 = 3 + 1, …

    Créez une fonction somme_des(n) qui crée un dictionnaire de combinaisons de deux dés ayant n faces, en utilisant la somme des deux dés comme clé du dictionnaire. Chaque valeur dans ce dictionnaire est une liste non-vide de tuples; chaque tuple contient la valeur des deux dés. "

    Voici le code que j'ai écris pour le moment qui n'est pas fonctionnel :
    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
     
    def somme_des(n):
        dic={}
        l1= [n for n in range(1,n+1)]
        l2= [n for n in range(1,n+1)]
        for v in l1:
            for k in l2:
                cle = v + k
                if cle in dic:
                    dic[cle]=(v,k)
                else:
                    dic[cle]=[(v,k)]
     
     
        return (dic)
     
    print(somme_des(6))


    Je n'ai pas forcément envie de recevoir la réponse tout de suite j'aimerais la découvrir par moi même. Grace a PythonTutor j'ai pu remarqué déjà que quand la clé est présente dans le dictionnaire il remplace la valeur existante par une nouvelle hors mon idée était de rajouter la valeur à la liste qui fait référence à la clé.

    Help ?

    Merci infiniment

  2. #2
    Expert éminent sénior
    Salut,

    Citation Envoyé par KanielOutis Voir le message
    hors mon idée était de rajouter la valeur à la liste qui fait référence à la clé.
    Si c'est l'idée, relisez votre code et essayez de trouver comment/où vous l'avez exprimée (en Python).

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

  3. #3
    Candidat au Club
    J'ai tenté de passer par cette configuration, j'ai obtenu un message d'erreur "nonetype" object has not attribute append. Voici mon code

    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
    def somme_des(n):
        dic={}
        l1= [n for n in range(1,n+1)]
        l2= [n for n in range(1,n+1)]
     
     
        for v in l1:
            for k in l2:
                cle = v + k
                if cle in dic:
                    dic[cle]= dic[cle].append((v,k))
                else:
                    dic[cle]=list((v,k))
     
        return (dic)
     
    print(somme_des(6))


    Merci

  4. #4
    Membre chevronné
    Oui utiliser append est une bonne idée. Mais revoyez comment vous l'utilisez, car ce n'est pas comme cela dont on s'en sert !

  5. #5
    Candidat au Club
    Merci pour vos réponses,


    Je poste mon code pour cet exercice pour ceux qui aimerait avoir la solution.

    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
    def somme_des(n):
        dic={}
        l1= [n for n in range(1,n+1)]
        l2= [n for n in range(1,n+1)]
     
     
        for v in l1:
            for k in l2:
                cle = v + k
                item=(v,k)
                if cle in dic:
                    dic[cle].append(item)
                else:
                    dic[cle]=list((item))
     
        return (dic)


    Une dernière question, lors de l'affichage du dictionnaire toutes les valeurs sont corrects seulement le premier tuple qui figure comme valeur n'a pas de parenthèse, j'aimerais rendre ça plus homogène et y incorporer des parenthèses aussi ... En relisant mon code je ne vois pas ce qui a entrainé le fait de ne pas avoir ces parenthèses pour la première valeur tuple de chaque clé du dictionnaire?

    Merci bien !

  6. #6
    Membre expert
    Salut,

    Citation Envoyé par KanielOutis Voir le message

    Une dernière question, lors de l'affichage du dictionnaire toutes les valeurs sont corrects seulement le premier tuple qui figure comme valeur n'a pas de parenthèse, j'aimerais rendre ça plus homogène et y incorporer des parenthèses aussi ...
    Tu peux remplacer dic[cle] = list((item)) par dic[cle] = [item]...

    Citation Envoyé par KanielOutis Voir le message
    En relisant mon code je ne vois pas ce qui a entrainé le fait de ne pas avoir ces parenthèses pour la première valeur tuple de chaque clé du dictionnaire?
    C'est parce que list((item)) converti le tuple item en une liste et c'est cette liste que tu ajoutes au dico alors que toi tu voulais ajouter une liste ayant le tuple item comme premier élément.

  7. #7
    Rédacteur



    Ma solution :

    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
    def somme_des(n: int = 6) -> dict:
        dico = {}
        for x in range(2, 2 * n + 1, 1):
            dico[x] = []
     
        for i in range(1, n + 1, 1):
            for j in range(1, n + 1, 1):
                dico[i+j].append((i, j))
        return dico
     
     
    print(somme_des())
     
    """
    {2: [(1, 1)], 
    3: [(1, 2), (2, 1)], 
    4: [(1, 3), (2, 2), (3, 1)], 
    5: [(1, 4), (2, 3), (3, 2), (4, 1)], 
    6: [(1, 5), (2, 4), (3, 3), (4, 2), (5, 1)], 
    7: [(1, 6), (2, 5), (3, 4), (4, 3), (5, 2), (6, 1)], 
    8: [(2, 6), (3, 5), (4, 4), (5, 3), (6, 2)], 
    9: [(3, 6), (4, 5), (5, 4), (6, 3)], 
    10: [(4, 6), (5, 5), (6, 4)], 
    11: [(5, 6), (6, 5)], 
    12: [(6, 6)]}
    """

  8. #8
    Expert éminent sénior
    Salut,

    Citation Envoyé par KanielOutis Voir le message
    En relisant mon code je ne vois pas ce qui a entrainé le fait de ne pas avoir ces parenthèses pour la première valeur tuple de chaque clé du dictionnaire?
    Quand vous avez ce genre de soucis, ayez le réflexe de lancer l'interpréteur Python et de tester:
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    >>> item = 1,2
    >>> L = list(item)
    >>> L.append(item)
    >>> L
    [1, 2, (1, 2)]
    >>>


    Maintenant que vous avez un code qui fonctionne, relisez le essayez de justifier chacune de ses lignes, simplifiez.
    Par exemple, pourquoi écrire:
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
        l1= [n for n in range(1,n+1)]
        l2= [n for n in range(1,n+1)]
     
        for v in l1:
            for k in l2:

    alors que:
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
        for v in range(1,n+1):
            for k in range(1,n+1):

    suffirait?

    De même, vous pouvez ré-écrire:
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
                cle = v + k
                item=(v,k)
                if cle in dic:
                    dic[cle].append(item)
                else:
                    dic[cle]=list((item))

    avec:
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
                cle = v + k
                if cle not in dic:
                    dic[cle] = []
                dic[cle].append((v,k))


    Puis un jour, vous allez vous rendre compte qu'un "dictionnaire" (ou tout objet d'une bibliothèque) a été fabriqué pour éviter au développeur d'avoir à répéter les mêmes lignes de codes... Et cherchez quelles sont les méthodes d'un dictionnaire qui permettent de simplifier sa construction dans des cas comme çà.

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

  9. #9
    Membre confirmé
    bonjour,

    l'utilisation de itertools répond très bien à ce que vous voulez faire:
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    >>> import itertools
    >>> r = {}
    >>> for d1, d2 in itertools.product(range(1, 7), range(1, 7)):
    	r[d1+d2] = r.get(d1+d2, 0) + 1
     
     
    >>> r
    {2: 1, 3: 2, 4: 3, 5: 4, 6: 5, 7: 6, 8: 5, 9: 4, 10: 3, 11: 2, 12: 1}


    si on décompose un peu:

    les ranges(1, 7) représentent vos deux dès
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    >>> list(range(1, 7))
    [1, 2, 3, 4, 5, 6]



    itertools.product permet de "multiplier" des itérables entre eux
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    >>> list(itertools.product([1, 2, 3], [1, 2, 3]))
    [(1, 1), (1, 2), (1, 3), (2, 1), (2, 2), (2, 3), (3, 1), (3, 2), (3, 3)]


    donc à la fin
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    >>> list(itertools.product(range(1, 7), range(1, 7)))
    [(1, 1), (1, 2), (1, 3), (1, 4), (1, 5), (1, 6), (2, 1), (2, 2), (2, 3), (2, 4), (2, 5), (2, 6), (3, 1), (3, 2), (3, 3), (3, 4), (3, 5), (3, 6), (4, 1), (4, 2), (4, 3), (4, 4), (4, 5), (4, 6), (5, 1), (5, 2), (5, 3), (5, 4), (5, 5), (5, 6), (6, 1), (6, 2), (6, 3), (6, 4), (6, 5), (6, 6)]
    vous permet d'avoir toutes les combinaisons possibles.


    après on veux incrémenter les clefs du dictionnaire mais dès fois les clefs n'existent pas,
    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
    >>> r = {}
    >>> r["clef qui n'existe pas"] = r["clef qui n'existe pas"] + 1
    Traceback (most recent call last):
      File "<pyshell#30>", line 1, in <module>
        r["clef qui n'existe pas"] = r["clef qui n'existe pas"] + 1
    KeyError: "clef qui n'existe pas"
     
    >>> r["clef qui n'existe pas"]
    Traceback (most recent call last):
      File "<pyshell#31>", line 1, in <module>
        r["clef qui n'existe pas"]
    KeyError: "clef qui n'existe pas"
     
    >>> r.get("clef qui n'existe pas", "valeur par défaut")
    'valeur par défaut'

    si on essaye d'incrémenter directement ça ne marche pas, par contre on peux obtenir une valeur par défaut si la clef n'est pas trouvée
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    >>> r["clef qui n'existe pas"] = r.get("clef qui n'existe pas", "valeur par défaut")
    >>> r
    {"clef qui n'existe pas": 'valeur par défaut'}


    le
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    r[d1+d2] = r.get(d1+d2, 0) + 1
    aurait pu aussi s'écrire
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    >>> if d1+d2 in r:
    	r[d1+d2] += 1
    else:
    	r[d1+d2] = 1

  10. #10
    Candidat au Club
    Hello tout le monde,

    Merci infiniment à tous pour vos tonnes de conseils et d'avoir pris le temps de répondre !

    En effet mon code est fonctionnel mais loin d'être optimiser.. Je suis encore débutant (en préparation d'un examen sur python) et pour le moment le fait d'avoir un code fonctionnel pour chaque exercice est déjà une grande victoire !

    Je recréerai un topic si besoin, je passe celui-ci en résolu !

    D'ailleurs on m'a dit qu'un bon exercice pour devenir bon en programmation était d'aider des personnes, je dois imaginé que je suis encore trop faible car les questions posés sur ce forum sont hors de ma portée ...