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

Calcul scientifique Python Discussion :

Exercice : Somme de deux dés


Sujet :

Calcul scientifique Python

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2020
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2020
    Messages : 11
    Points : 5
    Points
    5
    Par défaut 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
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 283
    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 283
    Points : 36 770
    Points
    36 770
    Par défaut
    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
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2020
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2020
    Messages : 11
    Points : 5
    Points
    5
    Par défaut
    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 émérite

    Homme Profil pro
    Ingénieur calcul scientifique
    Inscrit en
    Mars 2013
    Messages
    1 229
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur calcul scientifique

    Informations forums :
    Inscription : Mars 2013
    Messages : 1 229
    Points : 2 328
    Points
    2 328
    Par défaut
    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
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2020
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2020
    Messages : 11
    Points : 5
    Points
    5
    Par défaut
    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
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    2 873
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 2 873
    Points : 3 717
    Points
    3 717
    Par défaut
    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

    Avatar de danielhagnoul
    Homme Profil pro
    Étudiant perpétuel
    Inscrit en
    Février 2009
    Messages
    6 389
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant perpétuel
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2009
    Messages : 6 389
    Points : 22 933
    Points
    22 933
    Billets dans le blog
    125
    Par défaut


    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)]}
    """

    Blog

    Sans l'analyse et la conception, la programmation est l'art d'ajouter des bogues à un fichier texte vide.
    (Louis Srygley : Without requirements or design, programming is the art of adding bugs to an empty text file.)

  8. #8
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 283
    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 283
    Points : 36 770
    Points
    36 770
    Par défaut
    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 éclairé
    Homme Profil pro
    BTS SN IR
    Inscrit en
    Mai 2017
    Messages
    513
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 24
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : BTS SN IR

    Informations forums :
    Inscription : Mai 2017
    Messages : 513
    Points : 700
    Points
    700
    Par défaut
    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
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2020
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2020
    Messages : 11
    Points : 5
    Points
    5
    Par défaut
    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 ...

Discussions similaires

  1. [Oracle] jointures avec une somme sur deux champs
    Par guggus dans le forum Langage SQL
    Réponses: 3
    Dernier message: 12/10/2006, 17h06
  2. SQL SERVER 2000(Somme de deux SELECT )
    Par gwadakillah dans le forum Langage SQL
    Réponses: 1
    Dernier message: 09/08/2006, 14h18
  3. somme de deux champs d'une requete
    Par decour dans le forum Access
    Réponses: 2
    Dernier message: 22/03/2006, 09h43
  4. [Requete] Calcul Somme entre deux temps pour chaque jour
    Par nico33307 dans le forum Requêtes et SQL.
    Réponses: 5
    Dernier message: 21/03/2006, 00h58
  5. La somme de deux champs en sql ss access, Cmt faire ?
    Par elhosni dans le forum Requêtes et SQL.
    Réponses: 5
    Dernier message: 11/01/2006, 23h00

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