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 :

eliminer les paires de doublons inverses [Python 2.X]


Sujet :

Python

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    321
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 321
    Points : 109
    Points
    109
    Par défaut eliminer les paires de doublons inverses
    bonjour,

    j'essaie d'enlever mes doublons sur ce genre de liste qui est présente dans une table sur 2 colonnes
    pour le premier c'est
    colonnea='1'
    colonneb='2'

    une fois extraite cela donne:

    a=[('1','2'),('3','4'),('2','1'),('5','6'),('4','3')]

    et donc je veux enlever les paires inverse en doublon
    ('2','1'),('4','3')

    j'ai essayé de faire deux boucles avec un if

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    for row in a:
    	for rows in colonneb:
    		if row[1]>rows:
    mais cela me prend tout les doublons??

    si quelqu'un a une suggestion??

    merci d'avance

  2. #2
    Expert éminent

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 300
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 300
    Points : 6 780
    Points
    6 780
    Par défaut
    Salut,

    Qu'est ce que ton code a avoir avec ta question ?

    Pour tes doublons utilise une boucle, par exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    Python 3.4.3 (default, Nov 17 2016, 01:08:31) 
    [GCC 4.8.4] on linux
    Type "help", "copyright", "credits" or "license" for more information.
    a = [('1', '2'), ('3', '4'), ('2', '1'), ('5', '6'), ('4', '3')]
    >>> for item in a:
    ...     try:
    ...         a.remove(tuple(reversed(item)))
    ...     except:
    ...         pass
    ... 
    >>> a
    [('1', '2'), ('3', '4'), ('5', '6')]

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    321
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 321
    Points : 109
    Points
    109
    Par défaut
    oula oui,

    je voulais plutôt en venir à cela.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    a = [('1', '2'), ('3', '4'), ('2', '1'), ('5', '6'), ('4', '3')]
    b=[row for row in a if row[0]<row[1]]
    >>>b
    >>>[('1', '2'), ('3', '4'), ('5', '6')]

    et du coup avec reverse ça fonctionne bien aussi
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    b=[row for row in reversed(a) if row[0]<row[1]]
    [('5', '6'), ('3', '4'), ('1', '2')]
    mais ça change l'ordre


    j ai encore un peu de mal à totalement comprendre comment fonctionne ta boucle .
    enfin plutôt le réflexe d'utiliser le try except pour ça...(a.remove(tuple(reversed(item))))
    je reste encore primaire

    merci

  4. #4
    Expert éminent

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 300
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 300
    Points : 6 780
    Points
    6 780
    Par défaut
    Mon code fait ceci:

    - On prend le premier tuple ('1', '2')
    - On le renverse --> ('2', '1')
    - On le supprime de la liste avec remove()

    Mais, si il n'existe pas dans la liste, cela déclenchera une erreur donc on procède dans un bloc try-except.

  5. #5
    Membre confirmé
    Homme Profil pro
    Développeur banc de test
    Inscrit en
    Mai 2014
    Messages
    199
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur banc de test
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Mai 2014
    Messages : 199
    Points : 482
    Points
    482
    Par défaut
    Bonjour,

    Si j'ai bien compris que votre besoin est de supprimer les doublons, et ne garder que ceux dont l'ordre est respecté ?

    Dans ce cas voici une version compacte :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    a = [('1', '2'), ('3', '4'), ('2', '1'), ('5', '6'), ('4', '3')]
    Version écrite en intension :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [item for item in a if tuple(sorted(item)) not in a or tuple(sorted(item)) == item]
    Qui donne ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [('1', '2'), ('3', '4'), ('5', '6')]
    chaque élément item va remplir la liste si :
    • item trié n’existe pas déjà dans la liste d'origine noté a: Exemple item = (2, 1) donnant (1, 2) sera rejeté puisque il existe déjà
    • Ou si item trié est égal à lui même avant d'être trié: Exemple item = (1, 2), donnant (1, 2) sera conservé puisque il est égal à lui-même



    Et voici une version en iterateur avec filter :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    filtered_a = filter(lambda item, a=a: tuple(sorted(item)) not in a or tuple(sorted(item)) == item, a)
    list(filtered_a)
    Qui donne ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [('1', '2'), ('3', '4'), ('5', '6')]

  6. #6
    Expert éminent Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 035
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 035
    Points : 8 400
    Points
    8 400
    Par défaut
    salut,

    pour la forme une autre avec filter :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    >>> filter (lambda x: cmp(*x)<0, [('1', '2'), ('3', '4'), ('2', '1'), ('5', '6'), ('4', '3')])
    [('1', '2'), ('3', '4'), ('5', '6')]

  7. #7
    Membre expérimenté Avatar de plxpy
    Homme Profil pro
    Ingénieur géographe
    Inscrit en
    Janvier 2009
    Messages
    792
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur géographe
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Janvier 2009
    Messages : 792
    Points : 1 481
    Points
    1 481
    Par défaut
    Bonjour

    La question posée ici a son intérêt mais, comme je fréquente également un forum sur les SIG, je me pose la question du problème d'origine.

    Une liste de couples ? Une liste de coordonnées (x,y) (cartos ou géos, peu importe) ?

    Le problème est-il bien posé ?
    "La simplicité ne précède pas la complexité, elle la suit." - Alan J. Perlis
    DVP ? Pensez aux cours et tutos, ainsi qu'à la FAQ !

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    321
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 321
    Points : 109
    Points
    109
    Par défaut
    merci pour tout :-)

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

Discussions similaires

  1. eliminer les doublons d'un tableau
    Par wided_instm dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 22/09/2006, 10h56
  2. TMemo : eliminer les doublons
    Par delphidebutant dans le forum Delphi
    Réponses: 4
    Dernier message: 28/08/2006, 18h13
  3. [XSL] Eliminer les doublons dans un noeud
    Par Shadow aok dans le forum XSL/XSLT/XPATH
    Réponses: 4
    Dernier message: 13/04/2006, 15h17
  4. Eliminer les doublons dans un tableau d'entiers
    Par engi dans le forum Algorithmes et structures de données
    Réponses: 18
    Dernier message: 21/03/2006, 13h59
  5. Eliminer les doublons d'un tableau de hachage
    Par dreydrey dans le forum Langage
    Réponses: 21
    Dernier message: 15/11/2005, 15h03

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