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

Algorithmes et structures de données Discussion :

Comparaison de tuples dans une liste


Sujet :

Algorithmes et structures de données

  1. #1
    Membre actif
    Profil pro
    Inscrit en
    Février 2003
    Messages
    926
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 926
    Points : 273
    Points
    273
    Par défaut Comparaison de tuples dans une liste
    Bonjour,

    je travaille en python et j'ai une liste de tuples.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    listeM = ((x1,y1),(x2,y2)...)
    Je voudrais vérifier qu'il n'y ait pas de doublon dans les x et de doublon dans les y.

    J'affiche les x et le y ainsi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        for n in range(0,len(listeM)):
            print('mon X = '+ str(listeM[n][0]))
            print('mon Y = '+ str(listeM[n][1]))

    Comment comparer le plus simplement les x entre eux et les y entre eux?
    Dois-je par exemple insérer les x dans une nouvelle liste en vérifiant à chaque fois si la valeur ne s'y trouve pas déjà?
    Auriez-vous une méthode à me proposer, svp?

    Merci d'avance de votre aide.
    Cordialement,
    Arsène

  2. #2
    Membre émérite

    Homme Profil pro
    Formation: Chimie et Physique (structure de la matière)
    Inscrit en
    Décembre 2010
    Messages
    1 333
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 77
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Formation: Chimie et Physique (structure de la matière)
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2010
    Messages : 1 333
    Points : 2 570
    Points
    2 570
    Billets dans le blog
    9
    Par défaut Comparaison de tuples dans une liste
    Bonjour,

    Citation Envoyé par Arsene12 Voir le message
    ... Comment comparer le plus simplement les x entre eux et les y entre eux? ...
    En procédant à une double énumération, après avoir prévu des listes pour la consignation des résultats:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    Nx:= 0; Ny:= 0;
     
    FOR i:= 1 TO (N - 1) DO
      FOR j:= (i + 1) TO N DO
        IF (ListeM[i].x:= ListeM[j].x) THEN BEGIN
                                              Inc(Nx); ListeDx[Nx].u:= i; 
                                              ListeDx[Nx].v:= j 
                                            END
                                       ELSE IF (ListeM[i].y:= ListeM[j].y) THEN BEGIN  
                                                                                  Inc(Ny); ListeDy[Ny].u:= i; 
                                                                                  ListeDy[Ny].v:= j
                                                                                END


    Le français, notre affaire à tous
    Grand Dictionnaire Terminologique

  3. #3
    Membre actif
    Profil pro
    Inscrit en
    Février 2003
    Messages
    926
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 926
    Points : 273
    Points
    273
    Par défaut
    Merci, j'avais pensé moi aussi me servir des listes pour faire ce travail. Mais je travaille en python et non en java (ou C++). Donc mon code est le suivant :

    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
        maListeD1[:] = []
        maListeD2[:] = []
     
        if leMoinsDeFaux1==1:
           print("UN SEUL VRAI SUR UNE LIGNE COMMUNE")    
           for x in range(0,len(listeM)):
               if listeM[x][0] in maListeD1:
                  print("DOUBLON")
               else :
                  maListeD1.append(listeM[x][0])
     
        if leMoinsDeFaux2==1:
           print("UN SEUL VRAI SUR UNE COLONNE COMMUNE")    
           for y in range(0,len(listeM)):
              if listeM[y][1] in maListeD2:
                  print("DOUBLON")
              else :
                  maListeD2.append(listeM[y][1])
    J'ai auparavant défini mes listes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    listeM = []
    maListeD1 = []
    maListeD2 = []
    et j'ai rempli listeM.

  4. #4
    Membre actif
    Profil pro
    Inscrit en
    Février 2003
    Messages
    926
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 926
    Points : 273
    Points
    273
    Par défaut
    J'arrive à savoir s'il existe un doublon. Je voudrai maintenant le généraliser aux triplons, quadruplons, etc... Cela revient à connaitre le nombre de doublons, triplons, quadruplons,... présents dans une liste.

    J'utilise pour cela un dictionnaire qui me donne le nombre d’occurrences de chaque entrée :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
        if leMoinsDeFaux1==leMoinsDeFaux:
           print("UN SEUL VRAI SUR UNE COLONNE COMMUNE")    
           for x in range(0,len(listeM)):
                  maListeD1.append(listeM[x][0])
           maListeD1X = dict([(n, maListeD1.count(n)) for n in set(maListeD1)])
           print(maListeD1X)       
     
        if leMoinsDeFaux2==leMoinsDeFaux:
           print("UN SEUL VRAI SUR UNE LIGNE COMMUNE")    
           for y in range(0,len(listeM)):
                  maListeD2.append(listeM[y][1])
           maListeD2Y = dict([(n, maListeD2.count(n)) for n in set(maListeD2)])
           print(maListeD2Y)

  5. #5
    Membre émérite

    Homme Profil pro
    Formation: Chimie et Physique (structure de la matière)
    Inscrit en
    Décembre 2010
    Messages
    1 333
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 77
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Formation: Chimie et Physique (structure de la matière)
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2010
    Messages : 1 333
    Points : 2 570
    Points
    2 570
    Billets dans le blog
    9
    Par défaut Comparaison de tuples dans une liste
    Une solution consiste à travailler sur une liste de triplets, dont le troisième terme est initialisé à zéro - on suppose pour simplifier toutes les valeurs (x, y, u) du même type Entier.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TYPE ListeXY: ARRAY[1..N] OF RECORD  x, y, u: Entier  END;
    On peut reprendre une comparaison terme à terme - pour (x), par exemple - sous réserve que la nouvelle valeur considérée n'ait jamais été rencontrée auparavant.

    Cela se traduit par les instructions suivantes (c'est du Pascal, mais cela se lit comme du pseudo-code):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    FOR i:= 1 TO (N - 1) DO
      IF (Liste[i].u=0) THEN     // Valeur abordée pour la 1re fois
        BEGIN
          Liste[i].u:= 1;
          FOR j:= (i + 1) TO N DO 
            IF (Liste[i].x=Liste[j].x) THEN 
              BEGIN
                Inc(Liste[i].u); Liste[j].u:= Liste[i].u
              END
        END;
     
    IF (Liste[N].u=0) THEN Liste[N].u:= 1;
    On sait de cette manière combien de fois toute valeur de (x) intervient dans la liste (1).

    Un travail analogue peut être simultanément effectué sur les valeurs de (y) en ajoutant un terme supplémentaire, par une déclaration du type:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TYPE ListeXY: ARRAY[1..N] OF RECORD  x, y, u, v: Entier  END;
    À ce stade, les rangs des valeurs rencontrées plusieurs fois n'ont pas été mémorisés; on les retrouve facilement à partir de la liste précédente, ou en insérant quelques instructions supplémentaires dans l'algorithme envisagé.

    Il est facile de déterminer, à partir de la liste constituée, les valeurs maximales de (u), et (v), ainsi que le nombre total de valeurs différentes observées pour (x) et (y).

    (1) PS: j'ai omis de mentionner l'ajustement nécessaire pour que toute valeur de (x) rencontrée (k) fois corresponde à u = k (jusqu'ici, c'est seulement le cas de la première et de la dernière):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    FOR i:= 1 TO (N - 1) DO
      IF (Liste[i].u>2) THEN
        FOR j:= (i + 1) TO N DO 
          IF ((Liste[j].x=Liste[i].x) AND (Liste[j].u<Liste[i].u)) THEN Liste[j].u:= Liste[i].u


    Le français, notre affaire à tous
    Grand Dictionnaire Terminologique

  6. #6
    Membre actif
    Profil pro
    Inscrit en
    Février 2003
    Messages
    926
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 926
    Points : 273
    Points
    273
    Par défaut
    Je vois vaguement en quoi consiste cette solution. Comme je travaille en python, c'est aussi bien d'utiliser le dictionnaire. Les tuples représentent les coordonnées x et y de points. S'il y a des x ou des y égaux, cela veut dire que des points sont alignés, horizontalement ou verticalement. Si ces points sont situés dans une matrice, ils sont associés à une valeur, parfois booléenne. On peut ainsi comparer les rangées une à une pour savoir si elles sont identiques. Pour cela on constitue des listes. En résumé avec python, listes et dictionnaire permettent d'effectuer des comparaisons et de déterminer le nombre d’occurrences.

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

Discussions similaires

  1. Réponses: 16
    Dernier message: 18/01/2016, 18h54
  2. Comparaison "like" dans une liste
    Par Samyy17 dans le forum C#
    Réponses: 4
    Dernier message: 10/10/2012, 18h13
  3. [langage] Comment rajouter des champs dans une liste
    Par toto_titi dans le forum Langage
    Réponses: 4
    Dernier message: 28/08/2003, 14h09
  4. Réponses: 2
    Dernier message: 17/08/2003, 20h07
  5. Réponses: 4
    Dernier message: 24/04/2003, 22h28

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