web-dev-qa-db-fra.com

trouver le premier élément de séquence qui correspond à un critère

Quel serait le moyen le plus élégant et le plus efficace de trouver/retourner le premier élément de la liste qui correspond à un certain critère?

Par exemple, si j'ai une liste d'objets et j'aimerais obtenir le premier objet de ceux avec l'attribut obj.val==5. Je pourrais bien sûr utiliser la compréhension de liste, mais cela entraînerait O(n) et si n est grand, c'est un gaspillage. Je pouvais aussi utiliser une boucle avec break une fois le critère rempli, mais je pensais qu'il pourrait y avoir une solution plus pythonique/élégante.

269
Jonathan

Si vous n'avez pas d'autres index ou informations triées pour vos objets, vous devrez itérer jusqu'à ce qu'un tel objet soit trouvé:

next(obj for obj in objs if obj.val==5)

Ceci est cependant plus rapide qu'une compréhension complète de la liste. Comparez ces deux:

[i for i in xrange(100000) if i == 1000][0]

next(i for i in xrange(100000) if i == 1000)

Le premier a besoin de 5,75 ms, le second de 58,3 µs (100 fois plus rapide car la boucle est 100 fois plus courte).

482
eumiro
a=[100,200,300,400,500]
def search(b):
 try:
  k=a.index(b)
  return a[k] 
 except ValueError:
    return 'not found'
print(search(500))

ça va retourner l'objet si trouvé sinon ça va retourner "non trouvé"

4
Ashwini Chaudhary