Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 10 sur 10
  1. #1
    Invité de passage
    Homme Profil pro
    Inscrit en
    novembre 2012
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : novembre 2012
    Messages : 2
    Points : 1
    Points
    1

    Par défaut remove items in a list

    Bonjour à tous, j'ai cette liste :

    a = [(1, 3), (3, 0), (3, 2), (0, 3), (4, 3), (3, 1), (2, 3), (3, 6), (6, 2), (6, 5), (2, 6), (3, 4), (4, 7), (7, 3), (7, 6), (6, 3), (3, 7), (8, 7), (7, 4), (5, 6), (6, 10), (10, 5), (5, 10), (6, 7), (7, 11), (11, 6), (10, 6), (6, 11), (7, 8), (12, 7), (11, 7), (7, 12)]

    len(a) = 32

    Il y a des couples où (a,b) = (b,a) j'aimerai n'en garder qu'un. soit (a,b), soit (b,a).

    Donc j'aurai après len(a) = 16

    Merci.

  2. #2
    Expert Confirmé
    Avatar de tyrtamos
    Profil pro
    Inscrit en
    décembre 2007
    Messages
    2 272
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : décembre 2007
    Messages : 2 272
    Points : 3 754
    Points
    3 754

    Par défaut

    Bonjour,

    Solution possible:

    Code :
    1
    2
    3
    4
    5
    6
    7
    b = []
    for i, (e1, e2) in enumerate(a):
        if ((e1, e2) not in a[:i]) and ((e2, e1) not in a[:i]):
            b.append((e1, e2))
     
    print len(b), b
    16 [(1, 3), (3, 0), (3, 2), (4, 3), (3, 6), (6, 2), (6, 5), (4, 7), (7, 3), (7, 6), (8, 7), (6, 10), (10, 5), (7, 11), (11, 6), (12, 7)]
    La même chose en une seule ligne:

    Code :
    b = [(e1, e2) for i, (e1, e2) in enumerate(a) if ((e1, e2) not in a[:i]) and ((e2, e1) not in a[:i])]
    Ne rien ranger permet d'observer la loi universelle d'entropie: l'inévitable convergence vers le chaos...
    Mes recettes python: http://www.jpvweb.com

  3. #3
    Membre chevronné
    Homme Profil pro
    Inscrit en
    avril 2004
    Messages
    754
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : avril 2004
    Messages : 754
    Points : 793
    Points
    793

    Par défaut

    le filtre devrait se faire au moment de la création de la liste avec un tri sur chaque tuple, puis un set() sur la liste.

    sinon:
    Code :
    list(set(map(lambda x:tuple(sorted(x)),a)))

  4. #4
    Invité de passage
    Homme Profil pro
    Inscrit en
    novembre 2012
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : novembre 2012
    Messages : 2
    Points : 1
    Points
    1

    Par défaut

    Merci beaucoup tyrtamos !

    Ta solution est clair et belle. Merci. J'ai bien compris l'intérêt de la fonction enumerate.

    Merci pour la seconde ligne. Je suis débutant alors je la garde pour plus tard quand je serai à l'aise.

    @josmiley Je ne connais pas encore assez Python pour comprendre ta ligne. Tout de même merci à toi aussi.

  5. #5
    Membre Expert
    Avatar de fred1599
    Homme Profil pro Fred
    Enseignant
    Inscrit en
    juillet 2006
    Messages
    1 801
    Détails du profil
    Informations personnelles :
    Nom : Homme Fred
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : juillet 2006
    Messages : 1 801
    Points : 2 440
    Points
    2 440

    Par défaut

    Je propose ma solution sans enumerate

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    a = [(1, 3), (3, 0), (3, 2), (0, 3), (4, 3), (3, 1), (2, 3), (3, 6), (6, 2), (6, 5), (2, 6), (3, 4), (4, 7), (7, 3), (7, 6), (6, 3), (3, 7), (8, 7), (7, 4), (5, 6), (6, 10), (10, 5), (5, 10), (6, 7), (7, 11), (11, 6), (10, 6), (6, 11), (7, 8), (12, 7), (11, 7), (7, 12)]
     
    liste = []
     
    for tup in a:
        x, y = tup
        if (y, x) not in liste:
            liste.append(tup)
    Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
    La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

  6. #6
    Membre Expert
    Homme Profil pro
    Inscrit en
    mars 2007
    Messages
    895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : mars 2007
    Messages : 895
    Points : 1 196
    Points
    1 196

    Par défaut

    Similaire à la solution de josmiley, mais avec un set comprehension (Python 2.7 ou 3.1+) et sans utiliser sorted:
    Code :
    list({(x,y) if x <= y else (y,x) for x,y in a})

  7. #7
    Membre chevronné
    Homme Profil pro
    Inscrit en
    avril 2004
    Messages
    754
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : avril 2004
    Messages : 754
    Points : 793
    Points
    793

    Par défaut

    sans blague ? ça existe un set comprehension ?

    trop coooool

  8. #8
    Membre Expert

    Homme Profil pro Bastien Montagne
    Diverses et multiples
    Inscrit en
    mai 2008
    Messages
    662
    Détails du profil
    Informations personnelles :
    Nom : Homme Bastien Montagne
    Localisation : France

    Informations professionnelles :
    Activité : Diverses et multiples

    Informations forums :
    Inscription : mai 2008
    Messages : 662
    Points : 1 153
    Points
    1 153

    Par défaut

    Voui ça existe… Mais attention, un set, ça implique la perte de l’ordonnancement original (ce qui n’a peut-être aucune importance ici, mais mieux vaut le préciser ).
    Incantation : Méchant forum, arrête de transformer toutes mes espaces insécables en astérisques

  9. #9
    Membre régulier
    Inscrit en
    juin 2007
    Messages
    112
    Détails du profil
    Informations personnelles :
    Âge : 64

    Informations forums :
    Inscription : juin 2007
    Messages : 112
    Points : 75
    Points
    75

    Par défaut Explications.

    Des infos à ce sujet .

    Google est notre ami

  10. #10
    Membre Expert
    Homme Profil pro
    Inscrit en
    mars 2007
    Messages
    895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : mars 2007
    Messages : 895
    Points : 1 196
    Points
    1 196

    Par défaut

    Et juste pour le fun, une version avec une sous-classe de tuple qui redéfinit __eq__ et __hash__ de façon à retourner la même valeur quel que soit l'ordre des éléments:
    Code :
    1
    2
    3
    4
    5
    6
    7
    >>> class UnorderedTuple(tuple):
    ... 	def __eq__(self, other):
    ... 		return sorted(self) == sorted(other)
    ... 	def __hash__(self):
    ... 		return tuple.__hash__(self) | tuple.__hash__(tuple(reversed(self)))
    ... 	
    >>> list(set(UnorderedTuple(x) for x in a))

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

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •