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 :

Afficher certaines possibilités de juxtaposer 3 caractères [Python 3.X]


Sujet :

Python

  1. #1
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2015
    Messages
    67
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2015
    Messages : 67
    Points : 61
    Points
    61
    Par défaut Afficher certaines possibilités de juxtaposer 3 caractères
    Bonsoir,

    Je réalise un programme me permettant de tracer tous les cercles circonscrits possibles avec N points. J'ai donc fais une fonction prenant comme paramètres 3 points et affichant le cercle circonscrit du triangle formé par ces 3 points.

    Mon problème : Ma fonction trace tous les cercles circonscrits possibles, c'est à dire que pour des points E,F,G elle me trace par 6 fois des cercles circonscrits identiques.
    C'est à dire : E,F,G - E,G,F - G,E,F - G,F,E - F,E,G - F,G,E ... bonjour les calculs inutiles ...

    Donc évidement j'ai chercher à palier ce problème mais je manque d’efficacité. Pour ça j'ai créé ce script simulant mes points par des caractères :

    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
     
     
    def circonscrit(A,B,C) :
        if A == B or A == C or B == C : # Ici j'élimine une partie des doublons
            print('-----')
        else :
            print(A,B,C) # Mais j'en ai encore beaucoup trop.
     
     
    def CbDePoints():
        nb = int(input('Combien de points désirés? '))
        for i in range(nb):
            for j in range(nb):
                for k in range(nb):
                        circonscrit(i,j,k)
                        # Pour chaque possibilité d'assemblage de 3 points,
                        # j'applique la fonction circonscrit
     
     
    print()
    CbDePoints()
    Donc comment détecter quelque part que A,B,C est pareil que B,C,A etc ... ?

    Merci de m'avoir lu et j'espère que vous m'avez compris

  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 Leododo Voir le message
    Donc comment détecter quelque part que A,B,C est pareil que B,C,A etc ... ?
    En rangeant (B, C, A) par ordre alphabétique pour le comparer à un (C, A, B) "rangé" lui aussi.
    Et plutôt que "ranger", on pourra comparer les "set":
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    >>> set('abc')
    {'a', 'b', 'c'}
    >>> set('abc') == set ('bca')
    True
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2015
    Messages
    67
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2015
    Messages : 67
    Points : 61
    Points
    61
    Par défaut
    Ah intéressant ...

    Je vais donc détecter les différents 3-uplets et en faire qu'un.

    Mais dans mes fonctions :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    def circonscrit(A,B,C) :
        if A == B or A == C or B == C :
            print('-----')
        else :
            print(A,B,C)
     
     
    def CbDePoints():
        nb = int(input('Combien de points désirés? '))
        for i in range(nb):
            for j in range(nb):
                for k in range(nb):
                        circonscrit(i,j,k)
    Où puis-je utiliser mon set() ?

    Je ne peux pas le mettre dans circonscrit() car il faudrait qu'il garde en mémoire les set() des paramètres pour chaque fois que la fonction est appelée

    Si je le mets dans CbDePoints(),
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    def CbDePoints():
        nb = int(input('Combien de points désirés? '))
        for i in range(nb):
            for j in range(nb):
                for k in range(nb):
                    if set('ijk')==set('kij'):
                        None
                    else :
                        circonscrit(i,j,k)
    C'est toujours vrai ... je sais pas si je pourrais qualifier ça de problème de 'mise en mémoire'

  4. #4
    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
    Citation Envoyé par Leododo Voir le message
    Je ne peux pas le mettre dans circonscrit() car il faudrait qu'il garde en mémoire les set() des paramètres pour chaque fois que la fonction est appelée
    Le plus simple serait de générer vos triplets avec itertools.combinaisons.

    J'en étais resté à:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Mon problème : Ma fonction trace tous les cercles circonscrits possibles, c'est à dire que pour des points E,F,G elle me trace par 6 fois des cercles circonscrits identiques.
    C'est à dire : E,F,G - E,G,F - G,E,F - G,F,E - F,E,G - F,G,E ... bonjour les calculs inutiles ...
    Facile dans ce cas, d'utiliser le set comme clef d'un dict et lui associer ce qu'on veut.

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

  5. #5
    Membre chevronné
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Septembre 2013
    Messages
    485
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2013
    Messages : 485
    Points : 2 151
    Points
    2 151
    Par défaut
    et une fonction qui ne reprend plus un point déjà utilisé.
    Du genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    def CbDePoints():
        nb = int(input('Combien de points désirés? '))
        for i in range(nb):
    	    for j in range(i+1,nb):
    		    for k in range(j+1,nb):
    			    circonscrit(i,j,k)
    Cela ne répondrait pas au besoin?

  6. #6
    Membre confirmé

    Homme Profil pro
    Bidouilleur
    Inscrit en
    Avril 2016
    Messages
    721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Bidouilleur

    Informations forums :
    Inscription : Avril 2016
    Messages : 721
    Points : 503
    Points
    503
    Billets dans le blog
    1
    Par défaut
    En faisant ça, tu sautes des éléments, j'avais un doute, du coup j'ai testé
    Le temps ronge l'amour comme l'acide.

  7. #7
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2015
    Messages
    67
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2015
    Messages : 67
    Points : 61
    Points
    61
    Par défaut Avec itertools
    Merci de vos réponses

    Citation Envoyé par wiztricks Voir le message
    Le plus simple serait de générer vos triplets avec itertools.combinaisons.
    Alors après avoir compris le fonctionnement de ce module, j'ai comparé le résultat, y'a pas photo :
    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
     
    from itertools import*
     
    def circonscrit(A,B,C) :
        if A == B or A == C or B == C :
            None
        else :
            print(A,B,C)
     
    def CbDePointsOriginal(nb): 
        for i in range(nb):
            for j in range(nb):
                for k in range(nb):
                    circonscrit(i,j,k)
     
    def CbDePointsModifié(nb):
        nbChaine =  ''
        for _ in range(nb):
            nbChaine += str(_)
        for k in (combinations((str(nbChaine)),3)):
            print(k)
     
     
    nb = int(input('Combien de points désirés? '))      
    print()
    CbDePointsOriginal(nb)
    print()
    CbDePointsModifié(nb)
    En revanche, il me reste à introduire la fonction circonscrit(A,B,C) dans ma fonction CbDePointsModifié(nb) qui utilise itertools.

    Comme cette partie de code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for k in (combinations((str(nbChaine)),3)):
    me renvoie toujours la même chose ( exemple : ('0', '3', '4') ),
    j'ai pensé à convertir en chaine, puis à couper pour récupérer uniquement les chiffres ( 0 3 4 ), puis à reconvertir en entier.

  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 Leododo Voir le message
    Comme cette partie de code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for k in (combinations((str(nbChaine)),3)):
    me renvoie toujours la même chose ( exemple : ('0', '3', '4') ),
    j'ai pensé à convertir en chaine, puis à couper pour récupérer uniquement les chiffres ( 0 3 4 ), puis à reconvertir en entier.
    combinations prend en argument une chose qui s'appelle itérable: 'ABC', [ 'A', 'B', 'C' ], (0, 1, 2), range(3),.... i.e. une séquence d'objets quelconques.

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

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

Discussions similaires

  1. Afficher certaines parties d'une image
    Par Seb33300 dans le forum Flash
    Réponses: 7
    Dernier message: 19/03/2007, 14h03
  2. [8.5][Logiciel] Afficher certains digits d'une désignation
    Par ickyknox dans le forum SAP Crystal Reports
    Réponses: 4
    Dernier message: 02/03/2007, 09h29
  3. Afficher un compteur avec nb de caractères constants
    Par aliassaf dans le forum Général Python
    Réponses: 2
    Dernier message: 22/06/2006, 18h38
  4. [vb 2005]Datagridview : comment afficher certaines colonnes
    Par estelledany dans le forum Windows Forms
    Réponses: 5
    Dernier message: 27/05/2006, 02h41
  5. VB6 - Masquer ou Afficher certain(s) noeud(s) d'un Treeview
    Par CBleu dans le forum VB 6 et antérieur
    Réponses: 15
    Dernier message: 17/01/2006, 15h36

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