Ich habe eine Liste von Objekten. Ich möchte ein (erstes oder was auch immer) Objekt in dieser Liste finden, dessen Attribut (oder Methodenergebnis - was auch immer) gleich ist value
.
Was ist der beste Weg, um es zu finden?
Hier ist ein Testfall:
class Test:
def __init__(self, value):
self.value = value
import random
value = 5
test_list = [Test(random.randint(0,100)) for x in range(1000)]
# that I would do in Pascal, I don't believe isn't anywhere near 'Pythonic'
for x in test_list:
if x.value == value:
print "i found it!"
break
Ich denke, Generatoren zu verwenden und reduce()
macht keinen Unterschied, weil es immer noch durch die Liste iterieren würde.
ps.: Gleichung zu value
ist nur ein Beispiel. Natürlich wollen wir ein Element bekommen, das jede Bedingung erfüllt.
Antworten:
Dadurch wird das erste Element aus der Liste abgerufen, das der Bedingung entspricht, und es wird zurückgegeben,
None
wenn kein Element übereinstimmt. Es ist meine bevorzugte Form für einen einzelnen Ausdruck.Jedoch,
Die naive Loop-Break-Version ist perfekt pythonisch - sie ist präzise, klar und effizient. Damit es dem Verhalten des Einzeilers entspricht:
Dies wird zugewiesen
None
,x
wenn Sie nichtbreak
aus der Schleife heraus.quelle
... if getattr(x, x.fieldMemberName) == value
. Dadurch wird das Attributx
mit dem darin gespeicherten Namen abgerufenfieldMemberName
und mit verglichenvalue
.else
Klausel soll sich in derfor
Schleife befinden, nicht dieif
. (Abgelehnte Bearbeitung).Da wurde es nicht nur zur Vervollständigung erwähnt. Der gute alte Filter zum Filtern Ihrer zu filternden Elemente.
Funktionsprogrammierung ftw.
Ich weiß, dass im Allgemeinen in Python Listen Verständnis bevorzugt wird oder zumindest das, was ich lese, aber ich sehe das Problem nicht, um ehrlich zu sein. Natürlich ist Python keine FP-Sprache, aber Map / Reduce / Filter sind perfekt lesbar und der Standard der Standardanwendungsfälle in der funktionalen Programmierung.
Hier bitteschön. Kennen Sie Ihre funktionale Programmierung.
Filterbedingungsliste
Einfacher geht es nicht:
quelle
filter
eine Liste zurück, die nicht mit kompatibel istnext
. 2 : Es erfordert, dass es eine bestimmte Übereinstimmung gibt, sonst erhalten Sie eineStopIteration
Ausnahme.Ein einfaches Beispiel : Wir haben das folgende Array
Nun wollen wir das Objekt in dem Array finden, dessen ID gleich 1 ist
next
mit ListenverständnisAusgabe aller oben genannten Methoden ist
{'id': 1, 'name': 'ronaldo'}
quelle
Ich bin gerade auf ein ähnliches Problem gestoßen und habe eine kleine Optimierung für den Fall entwickelt, dass kein Objekt in der Liste die Anforderung erfüllt (für meinen Anwendungsfall führte dies zu einer erheblichen Leistungsverbesserung):
Zusammen mit der Liste test_list behalte ich eine zusätzliche Menge test_value_set, die aus Werten der Liste besteht, nach denen ich filtern muss. Hier wird der andere Teil der Lösung von agf sehr schnell.
quelle
Sie könnten so etwas tun
Das ist, was ich benutze, um die Objekte in einer langen Reihe von Objekten zu finden.
quelle
Sie können auch einen umfassenden Vergleich über eine
__eq__
Methode für IhreTest
Klasse implementieren und denin
Operator verwenden. Sie sind sich nicht sicher, ob dies der beste eigenständige Weg ist. Wenn Sie jedochTest
Instanzen vergleichen müssen, die auf einervalue
anderen Stelle basieren , kann dies hilfreich sein.quelle
Für den folgenden Code ist xGen ein anonomer Generatorausdruck, yFilt ist ein Filterobjekt. Beachten Sie, dass für xGen der zusätzliche Parameter None zurückgegeben wird, anstatt StopIteration auszulösen, wenn die Liste erschöpft ist.
Ausgabe:
quelle