Précédent   Forum du club des développeurs et IT Pro > Autres langages > Python & Zope > Général Python
Général Python Forum d'entraide sur les fondamentaux du langage Python, syntaxe, POO, bibliothèque standard, ...
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 19/11/2012, 01h10   #1
_Rodman_
Invité de passage
 
Homme
Inscription : 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.
_Rodman_ est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/11/2012, 06h13   #2
tyrtamos
Expert Confirmé
 
Avatar de tyrtamos
 
Inscription : décembre 2007
Messages : 1 770
Détails du profil
Informations personnelles :
Localisation : France

Informations forums :
Inscription : décembre 2007
Messages : 1 770
Points : 3 038
Points : 3 038
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
tyrtamos est déconnecté   Envoyer un message privé Réponse avec citation 20
Vieux 19/11/2012, 09h06   #3
josmiley
Membre chevronné
 
Homme
Inscription : avril 2004
Messages : 670
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations forums :
Inscription : avril 2004
Messages : 670
Points : 722
Points : 722
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)))
josmiley est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/11/2012, 12h07   #4
_Rodman_
Invité de passage
 
Homme
Inscription : 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
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.
_Rodman_ est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/11/2012, 15h29   #5
fred1599
Membre Expert
 
Avatar de fred1599
 
Homme Fred
Enseignant
Inscription : juillet 2006
Messages : 1 315
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 315
Points : 1 810
Points : 1 810
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)
fred1599 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/11/2012, 21h00   #6
dividee
Membre Expert
 
Homme
Inscription : mars 2007
Messages : 851
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Belgique

Informations forums :
Inscription : mars 2007
Messages : 851
Points : 1 182
Points : 1 182
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})
dividee est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/11/2012, 22h46   #7
josmiley
Membre chevronné
 
Homme
Inscription : avril 2004
Messages : 670
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations forums :
Inscription : avril 2004
Messages : 670
Points : 722
Points : 722
sans blague ? ça existe un set comprehension ?

trop coooool
josmiley est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/11/2012, 07h24   #8
mont29
Membre Expert
 
Homme Bastien Montagne
Diverses et multiples
Inscription : mai 2008
Messages : 620
Détails du profil
Informations personnelles :
Nom : Homme Bastien Montagne
Localisation : France

Informations professionnelles :
Activité : Diverses et multiples

Informations forums :
Inscription : mai 2008
Messages : 620
Points : 1 029
Points : 1 029
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
mont29 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/11/2012, 08h34   #9
Papy Octet
Membre régulier
 
Inscription : juin 2007
Messages : 108
Détails du profil
Informations personnelles :
Âge : 63

Informations forums :
Inscription : juin 2007
Messages : 108
Points : 74
Points : 74
Par défaut Explications.

Des infos à ce sujet .

Google est notre ami
Papy Octet est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/11/2012, 13h15   #10
dividee
Membre Expert
 
Homme
Inscription : mars 2007
Messages : 851
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Belgique

Informations forums :
Inscription : mars 2007
Messages : 851
Points : 1 182
Points : 1 182
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))
dividee est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Cette discussion est résolue.
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 22h43.


 
 
 
 
Partenaires

Hébergement Web