131 votes

Recherche d'une liste d'objets en Python

Supposons que je crée une classe simple fonctionnant de la même manière qu'une structure de style C, pour contenir des éléments de données. J'essaie de comprendre comment rechercher dans une liste d'objets ceux dont l'attribut est égal à une certaine valeur. Voici un exemple trivial pour illustrer ce que j'essaie de faire.

Par exemple :

class Data:
    pass

myList = []

for i in range(20):
    data = Data()
    data.n = i
    data.n_squared = i * i
    myList.append(data)

Comment faire pour rechercher dans la liste myList si elle contient un élément avec n == 5 ?

J'ai cherché sur Google et dans la documentation de Python, et je pense que je pourrais faire cela avec une compréhension de liste, mais je n'en suis pas sûr. Je dois ajouter que j'utilise Python 2.4.3, ce qui signifie que je ne peux pas utiliser les nouvelles fonctionnalités de la version 2.6 ou 3.x.

10voto

Tom Dunham Points 2466

Vous pouvez utiliser in pour rechercher un élément dans une collection, et une compréhension de liste pour extraire le champ qui vous intéresse. Ceci (fonctionne pour les listes, les ensembles, les tuples, et tout ce qui définit la notion de __contains__ o __getitem__ ).

if 5 in [data.n for data in myList]:
    print "Found it"

Voir aussi

9voto

Oliver Breeden Points 51

Vous pouvez également utiliser la fonction next().

matched_obj = next(x for x in list if x.n == 10)

5voto

Johannes Weiß Points 19013

Vous devez ajouter un __eq__ et un __hash__ à votre méthode Data il pourrait vérifier si la classe __dict__ sont égaux (mêmes propriétés), puis si leurs valeurs sont également égales.

Si vous avez fait cela, vous pouvez utiliser

test = Data()
test.n = 5

found = test in myList

En in Le mot-clé vérifie si test est en myList .

Si vous ne voulez qu'un n propriété en Data que vous pourriez utiliser :

class Data(object):
    __slots__ = ['n']
    def __init__(self, n):
        self.n = n
    def __eq__(self, other):
        if not isinstance(other, Data):
            return False
        if self.n != other.n:
            return False
        return True
    def __hash__(self):
        return self.n

    myList = [ Data(1), Data(2), Data(3) ]
    Data(2) in myList  #==> True
    Data(5) in myList  #==> False

3voto

Dangph Points 5561

Pensez à utiliser un dictionnaire :

myDict = {}

for i in range(20):
    myDict[i] = i * i

print(5 in myDict)

1voto

Matt Koch Points 11

Utilisez la compréhension de la liste suivante en combinaison avec l'option index méthode :

data_n = 30
j = [data.n for data in mylist].index(data_n)
print(mylist[j].data.n == data_n)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X