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 185
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : décembre 2007
    Messages : 2 185
    Points : 3 724
    Points
    3 724

    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
    728
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : avril 2004
    Messages : 728
    Points : 791
    Points
    791

    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
    Expert Confirmé
    Avatar de fred1599
    Homme Profil pro Fred
    Enseignant
    Inscrit en
    juillet 2006
    Messages
    1 731
    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 731
    Points : 2 598
    Points
    2 598

    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
    891
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : mars 2007
    Messages : 891
    Points : 1 249
    Points
    1 249

    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
    728
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : avril 2004
    Messages : 728
    Points : 791
    Points
    791

    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
    661
    Détails du profil
    Informations personnelles :
    Nom : Homme Bastien Montagne
    Localisation : France

    Informations professionnelles :
    Activité : Diverses et multiples

    Informations forums :
    Inscription : mai 2008
    Messages : 661
    Points : 1 179
    Points
    1 179

    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
    109
    Détails du profil
    Informations personnelles :
    Âge : 64

    Informations forums :
    Inscription : juin 2007
    Messages : 109
    Points : 77
    Points
    77

    Par défaut Explications.

    Des infos à ce sujet .

    Google est notre ami

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

    Informations forums :
    Inscription : mars 2007
    Messages : 891
    Points : 1 249
    Points
    1 249

    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
  •