Recherche d'une occurence dans une liste

Le
vincent.brenner
Bonjour,

J'utilise python 2.5.2, et voici mon problème :

J'instancie des classes que j'ajoute à une liste.
Jusque la pas de problème.
Avant l'ajout de l'objet dans ma liste j'aimerai pouvoir vérifier si
il est déjà présent dans ma liste en définissant mes critères de
recherche.
J'aimerai pour cela définir une classe qui hérite de collection.Set
comme dans l'exemple donnée dans la documentation python :
http://docs.python.org/library/collections.html et surcharger la
méthode __contains__().
Problème la classe Set dans le Module collections est introuvable!
Question : Y a t-il un moyen propre et plus rapide de faire ce que je
désire ? et sinon est ce que quelqu'un a une idée concernant la non
présence de la classe Set dans le module collections puisque je suis
sur la version 2.5.2 et que dans la documentation il est précisié que
c'est inclu depuis la version 2.4
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Pierre Quentel
Le #19524631
On 9 juin, 12:40, wrote:
Bonjour,

J'utilise python 2.5.2, et voici mon problème :

J'instancie des classes que j'ajoute à une liste.
Jusque la pas de problème.
Avant l'ajout de l'objet dans ma liste j'aimerai pouvoir vérifier si
il est déjà présent dans ma liste en définissant mes critères d e
recherche.
J'aimerai pour cela définir une classe qui hérite de collection.Set
comme dans l'exemple donnée dans la documentation python :http://docs.p ython.org/library/collections.htmlet surcharger la
méthode __contains__().
Problème la classe Set dans le Module collections est introuvable!
Question : Y a t-il un moyen propre et plus rapide de faire ce que je
désire ? et sinon est ce que quelqu'un a une idée concernant la non
présence de la classe Set dans le module collections puisque je suis
sur la version 2.5.2 et que dans la documentation il est précisié que
c'est inclu depuis la version 2.4



Bonjour Vincent,

La doc n'est pas hyper claire, mais sur la page que tu indiques on
voit quand même en haut à gauche "Python v2.6.2", et au-dessus du
tableau des "Abstract Base Classes" une note qui indique qu'elles ont
été ajoutées dans la version 2.6. ce n'est donc pas illogique que tu
ne les trouves pas sur la 2.5.2

Sinon, si tu as une liste (au sens de la classe intégrée list)
d'instances d'une classe, pour tester si une instance existe déjà dans
la liste avant insertion, il suffit de faire :

if the_instance not in the_list:
the_list.append(the_instance)

Ici, "not in" signifie que le programme va faire le test d'égalité
entre les éléments de la liste et l'instance ; si un de ces tests est
vrai, "not in" est faux, donc on n'ajoute pas l'instance dans la liste

Le problème à résoudre n'est donc pas de surcharger la méthode
"__contains__()" mais plutôt de bien définir ce que signifie qu'une
instance est égale à une autre ; donc de définir la méthode __eq__ de
la classe

Un petit exemple :

==============
class Prenom:

def __init__(self,prenom):
self.prenom = prenom

def __eq__(self,autre):
return autre.prenom.lower() == self.prenom.lower()

la_liste = []
for prenom in ["Pierre","pierre","Vincent","Paul","vincent"]:
inst = Prenom(prenom)
if not inst in la_liste:
la_liste.append(inst)

print [item.prenom for item in la_liste]
============

Ici, deux instances de la classe Prenom sont égales si leur attribut
"prenom" une fois mis en minuscules est le même, par exemple Prenom
("Pierre") est égal à Prenom("pierre"). Le test "if not inst in
la_liste" élimine bien les instances égales

- Pierre
vincent.brenner
Le #19524931
On 9 juin, 14:50, Pierre Quentel
On 9 juin, 12:40, wrote:



> Bonjour,

> J'utilise python 2.5.2, et voici mon problème :

> J'instancie des classes que j'ajoute à une liste.
> Jusque la pas de problème.
> Avant l'ajout de l'objet dans ma liste j'aimerai pouvoir vérifier si
> il est déjà présent dans ma liste en définissant mes critères de
> recherche.
> J'aimerai pour cela définir une classe qui hérite de collection.Set
> comme dans l'exemple donnée dans la documentation python :http://docs .python.org/library/collections.htmletsurcharger la
> méthode __contains__().
> Problème la classe Set dans le Module collections est introuvable!
> Question : Y a t-il un moyen propre et plus rapide de faire ce que je
> désire ? et sinon est ce que quelqu'un a une idée concernant la non
> présence de la classe Set dans le module collections puisque je suis
> sur la version 2.5.2 et que dans la documentation il est précisié q ue
> c'est inclu depuis la version 2.4

Bonjour Vincent,

La doc n'est pas hyper claire, mais sur la page que tu indiques on
voit quand même en haut à gauche "Python v2.6.2", et au-dessus du
tableau des "Abstract Base Classes" une note qui indique qu'elles ont
été ajoutées dans la version 2.6. ce n'est donc pas illogique que t u
ne les trouves pas sur la 2.5.2

Sinon, si tu as une liste (au sens de la classe intégrée list)
d'instances d'une classe, pour tester si une instance existe déjà dan s
la liste avant insertion, il suffit de faire :

if the_instance not in the_list:
    the_list.append(the_instance)

Ici, "not in" signifie que le programme va faire le test d'égalité
entre les éléments de la liste et l'instance ; si un de ces tests est
vrai, "not in" est faux, donc on n'ajoute pas l'instance dans la liste

Le problème à résoudre n'est donc pas de surcharger la méthode
"__contains__()" mais plutôt de bien définir ce que signifie qu'une
instance est égale à une autre ; donc de définir la méthode __eq_ _ de
la classe

Un petit exemple :

==============
class Prenom:

    def __init__(self,prenom):
        self.prenom = prenom

    def __eq__(self,autre):
        return autre.prenom.lower() == self.prenom.lower()

la_liste = []
for prenom in ["Pierre","pierre","Vincent","Paul","vincent"]:
    inst = Prenom(prenom)
    if not inst in la_liste:
        la_liste.append(inst)

print [item.prenom for item in la_liste]
============

Ici, deux instances de la classe Prenom sont égales si leur attribut
"prenom" une fois mis en minuscules est le même, par exemple Prenom
("Pierre") est égal à Prenom("pierre"). Le test "if not inst in
la_liste" élimine bien les instances égales

- Pierre



Merci beaucoup Pierre pour ce petit résumé.
Bruno Desthuilliers
Le #19533291
a écrit :
Bonjour,

J'utilise python 2.5.2, et voici mon problème :

J'instancie des classes que j'ajoute à une liste.



Euh... Tu veux dire que tu ajout des instances à une liste, ou que tu
ajoute les classes elle-même à la liste ???

Jusque la pas de problème.
Avant l'ajout de l'objet dans ma liste j'aimerai pouvoir vérifier si
il est déjà présent dans ma liste



Chaque instance est unique (testable avec l'opérateur 'is' ou la
fonction id()).

class Foo(object):
pass

foos = []
foo = Foo()
foos.append(foo)
foo in foos
=> True

en définissant mes critères de
recherche.



Tu veux parler d'une égalité (même valeur de champs), alors, pas
d'identité ?

J'aimerai pour cela définir une classe qui hérite de collection.Set
comme dans l'exemple donnée dans la documentation python :
http://docs.python.org/library/collections.html et surcharger la
méthode __contains__().
Problème la classe Set dans le Module collections est introuvable!



cf réponse de Pierre.

Question : Y a t-il un moyen propre et plus rapide de faire ce que je
désire ?



Disons que la description de ton problème n'est pas tout à fait claire
(pour moi en tous cas).

Si ton besoin est d'éviter d'ajouter deux fois la même (au sens d'un
test d'identité) instance dans ta liste, et que l'ordre n'est pas
important, il suffit d'utiliser le type (builtin) 'set'. Sinon, peux-tu
en dire un peu plus ?
Publicité
Poster une réponse
Anonyme