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.
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).
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é"