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 :

tableau de valeurs sans doublons à arrondis


Sujet :

Python

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    53
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Juin 2008
    Messages : 53
    Points : 32
    Points
    32
    Par défaut tableau de valeurs sans doublons à arrondis
    Bonjour à tous,

    Je suis en train d'écrire un code lisant un fichier stl (fichier CAO maillé surfacique) et interprétant son contenu.
    Le contexte : je veux créer un tableau de points (une liste de coordonnées xyz de points = tableau "n x 3" avec n= nbre de points) mais certains points apparaissent plusieurs fois dans le tableau. J'enlève donc les doublons dans la liste en utilisant le code ci après :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    tableau_des_points = [[-300.0, 0.0, 700.0], [-300.0, 100.0, 700.0]], [[-300.0, 0.0, 700.0], [-325.88189999999997, 0.0, 796.59259999999995]], [[-428.7901, 0.0, 665.49080000000004], [-454.67200000000003, 0.0, 762.08339999999998]], [[-300.0, 100.0, 700.0], [-300.0, 1.421085e-014, 700.0]], [[-300.0, 66.666659999999993, 700.0], [-325.88189999999997, 66.666659999999993, 796.59259999999995]], [[-325.88189999999997, 0.0, 796.59259999999995], [-351.7638, 0.0, 893.18520000000001]], [[-325.88189999999997, 0.0, 796.59259999999995], [-300.0, 1.421085e-014, 700.0]], [[-351.5573, 0.0, 720.69449999999995], [-377.43920000000003, 0.0, 817.28700000000003]], [[-377.64569999999998, 0.0, 989.77779999999996], [-351.7638, 0.0, 893.18520000000001]], [[-308.62729999999999, 22.22222, 732.19749999999999], [-334.50920000000002, 22.22222, 828.79010000000005]]
    tableau_des_points_sans_doublon = []
    for k in tableau_des_points:
        if k not in tableau_des_points_sans_doublon:
            tableau_des_points_sans_doublon.append(k)
    Le problème est que certaines valeurs des coordonnées sont arrondies. Exemple : un même point peut être sous la forme (100.0, 0.0, 10.0) et sous la forme (99.9999999, 1.4e-12, 10.000001) car la conversion STL (réalisée par CATIA V5) gère mal les arrondis.
    Quelqu'un pourrait-il m'indiquer une astuce pour que mon code reconnaisse ces deux écritures différentes du même point comme identiques et ne les ajoute donc pas au tableau sans doublons. L'idéal serait qu'une variable me permette de définir à combien de chiffres après la virgule on peut considérer que les points sont identiques.
    Merci d'avance,

    Fred

  2. #2
    Membre chevronné

    Profil pro
    Account Manager
    Inscrit en
    Décembre 2006
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Account Manager

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 301
    Points : 1 752
    Points
    1 752
    Par défaut Une méthode possible
    Voici une méthode à tester et à adapter à ton cas :
    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
    #!/usr/bin/env python
    #coding=utf-8
     
    tableauDeNbres = [300, 300.000, (300+10**(-14)),1,2,3,0,10**(-14)]
    tableauNettoye = []
     
    for unNbre in tableauDeNbres:
        if not unNbre in tableauNettoye:
            tableauNettoye.append(unNbre)
     
    print '1ere Methode :'
    print '\t',
    print tableauNettoye
     
    # Ici on demande à Python d'arrondir les nombres
    # en gardant 3 chiffres après la virgule.
    tableauDeNbres = [float("%.3f" %float(x)) for x in tableauDeNbres]
    tableauNettoye = []
     
    for unNbre in tableauDeNbres:
        if not unNbre in tableauNettoye:
            tableauNettoye.append(unNbre)
     
    print '2eme Methode :'
    print '\t',
    print tableauNettoye
    On obtient :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    1ere Methode :
    	[300, 1, 2, 3, 0, 1e-14]
    2eme Methode :
    	[300.0, 1.0, 2.0, 3.0, 0.0]

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    53
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Juin 2008
    Messages : 53
    Points : 32
    Points
    32
    Par défaut
    Merci Rambc,

    En retravaillant un peu, j'ai trouvé une solution que je pense assez semblable à la tienne (mais un peu moins propre je pense). La voici :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    for k in tableau_des_points:
        if [eval("%.5f" %k[0]), eval("%.5f" %k[1]), eval("%.5f" %k[2])] not in tableau_des_points_sans_doublon:
            tableau_des_points_sans_doublon.append([eval("%.5f" %k[0]), eval("%.5f" %k[1]), eval("%.5f" %k[2])])
    print 'tableau_des_points_sans_doublon', tableau_des_points_sans_doublon
    Peux-tu me donner ton avis sur cette méthode stp? De toutes façons, je vais prendre la tienne...
    D'autre part, quelle est la différence entre et ? Y a-t-il une différence?

    Merci d'avance,

    Fred

  4. #4
    Membre éprouvé
    Avatar de Antoine_935
    Profil pro
    Développeur web/mobile
    Inscrit en
    Juillet 2006
    Messages
    883
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur web/mobile

    Informations forums :
    Inscription : Juillet 2006
    Messages : 883
    Points : 1 066
    Points
    1 066
    Par défaut
    Aucune différence dans la sémantique.
    Les deux testent que l'objet "k" ne soit pas dans le tableau.
    D'ailleurs, les deux deviennent le même bytecode:
    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 test1():
    ...     return k not in tableau
    ...
    >>> def test2():
    ...     return not k in tableau
    ...
    >>> from dis import dis
    >>> dis(test1)
      2           0 LOAD_GLOBAL              0 (k)
                  3 LOAD_GLOBAL              1 (tableau)
                  6 COMPARE_OP               7 (not in)
                  9 RETURN_VALUE
    >>> dis(test2)
      2           0 LOAD_GLOBAL              0 (k)
                  3 LOAD_GLOBAL              1 (tableau)
                  6 COMPARE_OP               7 (not in)
                  9 RETURN_VALUE

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    53
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Juin 2008
    Messages : 53
    Points : 32
    Points
    32
    Par défaut
    Ok, c'est noté, merci Antoine!

  6. #6
    Membre chevronné

    Profil pro
    Account Manager
    Inscrit en
    Décembre 2006
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Account Manager

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 301
    Points : 1 752
    Points
    1 752
    Par défaut
    Citation Envoyé par fraid49 Voir le message
    En retravaillant un peu, j'ai trouvé une solution que je pense assez semblable à la tienne (mais un peu moins propre je pense).

    Peux-tu me donner ton avis sur cette méthode stp?
    float("%.3f" %(1**(-14))) et eval("%.3f" %(1**(-14))) renvoient la même chose. Ceci étant dit, la 1ère instruction utilise juste une conversion, tandis que la seconde lance une évaluation de calcul, ce qui demande plus de travail en général. A choisir, je prendrais moi aussi la 1ère méthode.

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    53
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Juin 2008
    Messages : 53
    Points : 32
    Points
    32
    Par défaut
    C'est noté pour le temps de travail (de toutes façons, ta méthode est beaucoup plus propre que la mienne).
    Merci,

    Fred

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

Discussions similaires

  1. tableau à deux dimensions sans doublon c++
    Par Student_Master dans le forum C++
    Réponses: 6
    Dernier message: 05/09/2014, 09h32
  2. Compter le nombre valeurs sans doublon dans une zone de texte
    Par Alien_psy dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 23/02/2013, 16h57
  3. Réponses: 1
    Dernier message: 14/03/2011, 21h36
  4. Comment remplir un tableau avec random sans doublon ?
    Par muntu dans le forum Collection et Stream
    Réponses: 15
    Dernier message: 16/07/2010, 09h42
  5. [Oracle 10g] liste de valeurs sans doublons
    Par gojira dans le forum Langage SQL
    Réponses: 4
    Dernier message: 19/10/2006, 16h18

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