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 :

Virer des doublons de dés


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de RowanMayfair
    Femme Profil pro
    Développeuse Freelance
    Inscrit en
    Mars 2019
    Messages
    247
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 48
    Localisation : France, Haute Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Développeuse Freelance

    Informations forums :
    Inscription : Mars 2019
    Messages : 247
    Par défaut Virer des doublons de dés
    Bonjour,

    Je bloque sur un problème de dés (à jouer).
    c'est frustrant parce que j'ai l'impression qu'il y a une solution simple, mais je ne la trouve pas.

    le code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    n = int(input('Donnez un entier entre 2 et 12 : '))
     
    des = [[chiffre1,chiffre2] for chiffre1 in range(1,7) \
           for chiffre2 in range (1,7)\
          if chiffre1 + chiffre2 == n]
     
    print("Il y a {} façon d'obtenir {} avec 2 dés : {}.".format(len(des),n,des))
    (la compréhension de liste n'était pas forcément appropriée dans ce cas, mais je m'entraîne )

    Donc par exemple si je propose 10, il me répond "Il y a 3 façon d'obtenir 10 avec 2 dés : [[4, 6], [5, 5], [6, 4]]."
    Oui mais......4,6 et 6,4 c'est la même chose, il s'agit de dés. Donc en réalité il n'y a que 2 façons de faire 10 avec 2 dés.

    Ma question donc : comment je supprime l'un des doublons ?

  2. #2
    Membre éprouvé Avatar de olivier1969
    Homme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    Novembre 2013
    Messages
    153
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Assistant aux utilisateurs
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Novembre 2013
    Messages : 153
    Par défaut
    Hello ,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if chiffre1 + chiffre2 == n and chiffre1 <= chiffre2
    et du coup ... tu ne conserves qu'une seule des solutions

  3. #3
    Membre éclairé Avatar de RowanMayfair
    Femme Profil pro
    Développeuse Freelance
    Inscrit en
    Mars 2019
    Messages
    247
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 48
    Localisation : France, Haute Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Développeuse Freelance

    Informations forums :
    Inscription : Mars 2019
    Messages : 247
    Par défaut
    Oh mais oui tout simplement !

    Merci beaucoup Olivier

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

    Je suggère une autre approche pour le fun:

    Pour simuler le tirage des dés, on peut tirer toutes les combinaisons des 6 nombres (1,2,3,4,5,6) 2 à 2 en utilisant la fonction "combinations_with_replacement" du module itertools. A noter qu'on ne peut pas utiliser ici la fonction "combinations" puisqu'un premier dé avec un nombre n'exclut pas que le 2ème dé ait le même nombre.

    On crée ensuite un dictionnaire avec pour clé la somme des 2 dés tirés, et pour valeur la liste des couples de dés qui donne cette somme.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    from itertools import combinations, combinations_with_replacement
     
    L = []
    R = {}
    for elem in combinations_with_replacement([1,2,3,4,5,6], 2):
        L.append(elem)
        s = sum(elem)
        if s in R:
            R[s].append(elem)
        else:
            R[s] = [elem]
    Ce qui donne pour la liste L:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [(1, 1), (1, 2), (1, 3), (1, 4), (1, 5), (1, 6), (2, 2), (2, 3), (2, 4), (2, 5), (2, 6), (3, 3), (3, 4), (3, 5), (3, 6), (4, 4), (4, 5), (4, 6), (5, 5), (5, 6), (6, 6)]
    Et pour le dictionnaire R:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    {2: [(1, 1)], 3: [(1, 2)], 4: [(1, 3), (2, 2)], 5: [(1, 4), (2, 3)], 6: [(1, 5), (2, 4), (3, 3)], 7: [(1, 6), (2, 5), (3, 4)], 8: [(2, 6), (3, 5), (4, 4)], 9: [(3, 6), (4, 5)], 10: [(4, 6), (5, 5)], 11: [(5, 6)], 12: [(6, 6)]}
    On fait ce petit calcul au lancement du programme.

    Ensuite, à chaque question, par exemple x=7, on obtient la réponse immédiate de toutes les possibilités d'obtenir cette somme: R[7] => [(1, 6), (2, 5), (3, 4)]

  5. #5
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 738
    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 738
    Par défaut
    Salut,

    Éviter de créer des doublons pour les trier ensuite est effectivement meilleur: moins d'itérations et moins de tests pour dédoublonner.

    S'il est bon de faire de la publicité pour itertools et combinations_with_replacement, avec 2 dés, il y a plus "sobre" pour générer ces couples là:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    tirages = ( (i, j) for i in range(1, 7) for j in range(i, 7) )
    note: sûr qu'avec un nombre variables de dés...
    Puis on remplit la liste en utilisant .setdefault, fonctionnalité de base des dictionnaires, toujours intéressante à connaître:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    R = dict()
    for i, j in tirages:
        R.setdefault(i+j, []).append((i, j))
    Et çà donne un code plus "compact".

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

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

    Merci wiztricks. Effectivement, pour 2 dés, le code est plus simple.

    Et avec .setdefault (que je devrais utiliser plus souvent), ma solution peut être aussi plus concise:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    from itertools import combinations_with_replacement
     
    R = {}
    for elem in combinations_with_replacement([1,2,3,4,5,6], 2):
        R.setdefault(sum(elem), []).append(elem)
    Ce qui donne, bien sûr, le même résultat:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     2 => [(1, 1)]
     3 => [(1, 2)]
     4 => [(1, 3), (2, 2)]
     5 => [(1, 4), (2, 3)]
     6 => [(1, 5), (2, 4), (3, 3)]
     7 => [(1, 6), (2, 5), (3, 4)]
     8 => [(2, 6), (3, 5), (4, 4)]
     9 => [(3, 6), (4, 5)]
    10 => [(4, 6), (5, 5)]
    11 => [(5, 6)]
    12 => [(6, 6)]
    Et si on applique avec 3 dés, ça marche aussi, et on trouve, par exemple qu'il y a 6 façons d'obtenir une somme de 12:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    12 => [(1, 5, 6), (2, 4, 6), (2, 5, 5), (3, 3, 6), (3, 4, 5), (4, 4, 4)]

  7. #7
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 830
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 830
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par wiztricks Voir le message
    Puis on remplit la liste en utilisant .setdefault, fonctionnalité de base des dictionnaires, toujours intéressante à connaître:
    Que je ne connaissais pas
    Quand je pense à tous mes codes où j'ai écrit if truc not in dico: dico[truc]=machin...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

Discussions similaires

  1. [DTS] Import de données avec des doublons
    Par Hotchotte dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 24/03/2005, 14h19
  2. Eliminer des Doublon dans une Table
    Par Soulama dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 03/02/2005, 14h27
  3. 1 Table, Des doublons, ne rertenir que certains d'entre eux
    Par Dragano dans le forum Langage SQL
    Réponses: 3
    Dernier message: 26/01/2005, 12h06
  4. Effacer des doublons
    Par ben53 dans le forum Langage SQL
    Réponses: 2
    Dernier message: 12/07/2004, 17h56
  5. Réponses: 2
    Dernier message: 07/07/2004, 17h44

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