396 Stimmen

Erstes Sequenzelement finden, das ein Kriterium erfüllt

Was wäre der eleganteste und effizienteste Weg, um das erste Listenelement zu finden/zurückzugeben, das einem bestimmten Kriterium entspricht?

Wenn ich zum Beispiel eine Liste von Objekten habe und ich möchte das erste Objekt mit dem Attribut obj.val==5 . Ich könnte natürlich die Listenverarbeitung verwenden, aber das würde O(n) bedeuten, und wenn n groß ist, ist es verschwenderisch. Ich könnte auch eine Schleife verwenden mit break sobald das Kriterium erfüllt war, aber ich dachte, es könnte eine pythonischere/elegantere Lösung geben.

735voto

eumiro Punkte 193562

Wenn Sie keine anderen Indizes oder sortierten Informationen für Ihre Objekte haben, müssen Sie iterieren, bis ein solches Objekt gefunden wird:

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

Dies ist jedoch schneller als ein vollständiges Verständnis der Liste. Vergleichen Sie diese beiden:

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

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

Die erste benötigt 5,75ms, die zweite 58,3µs (100 mal schneller, weil die Schleife 100 mal kürzer ist).

1voto

Ashwini Chaudhary Punkte 231447
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))

gibt das Objekt zurück, wenn es gefunden wurde, sonst wird "nicht gefunden" zurückgegeben

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X