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.

197voto

Adam Rosenfield Points 176408

Vous pouvez obtenir une liste de todos faire correspondre des éléments avec la compréhension d'une liste :

[x for x in myList if x.n == 30]  # list of all elements with .n==30

Si vous souhaitez simplement déterminer si la liste contient des cualquier qui correspond et le faire (relativement) efficacement, vous pouvez le faire.

def contains(list, filter):
    for x in list:
        if filter(x):
            return True
    return False

if contains(myList, lambda x: x.n == 3)  # True if any element has .n==3
    # do stuff

96voto

gahooa Points 38006

Simple, élégant et puissant :

Un générateur d'expression en conjonction avec un (python 2.5+)

any(x for x in mylist if x.n == 10)

Utilise le logiciel Python any() qui est défini comme suit :

any(iterable) -> Retourne True si un élément de la table itérative est vrai. Equivalent à :

def any(iterable):
    for element in iterable:
        if element:
            return True
    return False

58voto

Charlie Martin Points 62306

Pour être complet, n'oublions pas la chose la plus simple qui pourrait fonctionner :

for i in list:
  if i.n == 5:
     # do something with it
     print "YAY! Found one!"

56voto

Markus Jarderot Points 33893
[x for x in myList if x.n == 30]               # list of all matches
[x.n_squared for x in myList if x.n == 30]     # property of matches
any(x.n == 30 for x in myList)                 # if there is any matches
[i for i,x in enumerate(myList) if x.n == 30]  # indices of all matches

def first(iterable, default=None):
  for item in iterable:
    return item
  return default

first(x for x in myList if x.n == 30)          # the first match, if any

49voto

vartec Points 53382
filter(lambda x: x.n == 5, myList)

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