‚In‘ unter Verwendung eines Attribut der Python Objekte in einem Array entsprechen

stimmen
39

Ich erinnere mich nicht, ob ich träume oder nicht, aber ich scheine es, daran zu erinnern eine Funktion ist, die wie etwas erlaubt,

foo in iter_attr(array of python objects, attribute name)

Ich habe über die docs aussah, aber diese Art der Sache nicht unter irgendwelchen offensichtlichen kotierten Header fallen

Veröffentlicht am 03/08/2008 um 14:19
quelle vom benutzer
In anderen Sprachen...                            


8 antworten

stimmen
38

Eine temporäre Liste, die alle Ihre Speicher essen könnten , würde bauen , wenn die Sequenz groß ist durchsucht eine Liste Verständnis verwenden. Auch wenn die Sequenz nicht groß ist, bedeutet den Aufbau der Liste Iterieren über die Gesamtheit der Sequenz vor inseiner Suche beginnen konnte.

Die temporäre Liste kann unter Verwendung eines Generators Ausdruck vermieden werden:

foo = 12
foo in (obj.id for obj in bar)

Nun, solange obj.id == 12in der Nähe von Beginn bar, wird die Suche schnell sein, auch wenn barunendlich lang ist.

Wie @ Matt vorgeschlagen, ist es eine gute Idee zu verwenden hasattr, wenn eines der Objekte barkann ein fehlt idAttribut:

foo = 12
foo in (obj.id for obj in bar if hasattr(obj, 'id'))
Beantwortet am 11/09/2008 um 23:42
quelle vom benutzer

stimmen
10

Suchen Sie eine Liste von Objekten zu erhalten , die ein bestimmtes Attribut haben? Wenn ja, eine Liste Verständnis ist der richtige Weg , dies zu tun.

result = [obj for obj in listOfObjs if hasattr(obj, 'attributeName')]
Beantwortet am 03/08/2008 um 16:59
quelle vom benutzer

stimmen
8

Sie können immer selbst eine Beurteilung schreiben:

def iterattr(iterator, attributename):
    for obj in iterator:
        yield getattr(obj, attributename)

mit etwas arbeiten, das iteriert, es ist ein Tupel, Liste oder was auch immer.

Ich liebe Python, macht es Sachen wie diese sehr einfach und nicht mehr von einem Aufwand als nötig, und in Gebrauch Sachen wie diese ist äußerst elegant.

Beantwortet am 27/08/2008 um 21:13
quelle vom benutzer

stimmen
4

Die Funktion , die Sie daran denken , ist wahrscheinlich operator.attrgettter. Um zum Beispiel eine Liste zu erhalten, die den Wert jedes Attribut „id“ des Objekts enthält:

import operator
ids = map(operator.attrgetter("id"), bar)

Wenn Sie möchten, um zu überprüfen, ob die Liste ein Objekt enthält mit einem id == 12, dann eine saubere und effiziente (dh nicht durchläuft nicht die ganze Liste unnötig) Art und Weise, es zu tun ist:

any(obj.id == 12 for obj in bar)

Wenn Sie möchten, mit attrgetter ‚in‘ verwenden, während immer noch faul Iteration der Liste beibehalten:

import operator,itertools
foo = 12
foo in itertools.imap(operator.attrgetter("id"), bar)

Beantwortet am 05/02/2011 um 09:10
quelle vom benutzer

stimmen
4

Nein, Sie träumen nicht. Python hat ein ziemlich ausgezeichnetes Liste Verständnis System, das Sie Listen manipulieren ziemlich elegant läßt, und je nach genau das, was Sie erreichen wollen, kann dies ein paar Arten erfolgen. Im Wesentlichen, was Sie tun, ist zu sagen „Für Element in der Liste, wenn criteria.matches“, und davon, dass Sie nur durch die Ergebnisse oder Dump die Ergebnisse in eine neue Liste laufen können.

Ich werde ein Beispiel zur Krippe Dive Into Python hier, weil es ziemlich elegant ist , und sie sind klüger als ich bin. Hier sind sie eine Liste von Dateien in einem Verzeichnis bekommen, dann Filtern der Liste für alle Dateien , die einen regulären Ausdruck Kriterien entsprechen.

    files = os.listdir(path)                               
    test = re.compile("test\.py$", re.IGNORECASE)          
    files = [f for f in files if test.search(f)]

Sie können dies tun, ohne regulären Ausdrücke, für Ihr Beispiel für etwas, wo Ihr Ausdruck am Ende für ein Spiel true zurück. Es gibt andere Optionen, wie mit der Filter () Funktion, aber wenn ich wählen würde, würde ich mit diesen gehen.

Eric Sipple

Beantwortet am 03/08/2008 um 15:30
quelle vom benutzer

stimmen
3

Wenn Sie auf der Suche etwas von der Ferne anständiger Größe planen, die beste Wahl sein wird, einen Wörterbuch oder einen Satz zu verwenden. Andernfalls müssen Sie im Grunde durch jedes Element des Iterators durchlaufen, bis Sie zum einen bekommen Sie wollen.

Ist dies nicht unbedingt die Leistung empfindlich Code ist, dann sollte die Liste Verständnis Art und Weise arbeiten. Aber beachten Sie, dass es ziemlich ineffizient ist, weil es jedes Element des Iterators geht über und geht dann zurück über sie wieder, bis er findet, was er will.

Denken Sie daran, hat Python eine der effizientesten Hashalgorithmen um. Verwenden Sie es zu Ihrem Vorteil.

Beantwortet am 27/08/2008 um 21:30
quelle vom benutzer

stimmen
3

Was ich dachte an kann mit Listenkomprehensionen erreicht werden, aber ich dachte, dass es eine Funktion war, die in eine etwas übersichtlichen Art und Weise tat dies.

dh ‚bar‘ ist eine Liste von Objekten, die alle über das Attribut ‚id‘

Die mythische funktional:

foo = 12
foo in iter_attr(bar, 'id')

Die Liste Verständnis Art und Weise:

foo = 12
foo in [obj.id for obj in bar]

Im Nachhinein ist die Liste Verständnis Art und Weise ohnehin recht ordentlich.

Beantwortet am 03/08/2008 um 17:13
quelle vom benutzer

stimmen
-1

Ich denke:

#!/bin/python
bar in dict(Foo)

Ist das, was Sie denken an. Beim Versuch zu sehen , ob ein bestimmte Schlüssel in einem Wörterbuch existiert in Python (Python-Version einer Hash - Tabelle) gibt es zwei Möglichkeiten zu überprüfen. Zuerst ist das has_key()Verfahren auf das Wörterbuch angehängt wird und die zweiten das oben gegebene Beispiel. Es wird einen Booleschen Wert zurück.

Das sollte Ihre Frage beantworten.

Und nun ein wenig off topic diese in die binden Liste Verständnis zuvor gegebene Antwort (für ein bisschen mehr Klarheit). Listenkomprehension eine Liste von einer grundlegenden Konstruktion für Schleife mit Modifikatoren. Als Beispiel (zu klären , leicht), eine Möglichkeit , die verwenden in dictSprachkonstrukt in einer Liste Verständnis :

Sagen Sie bitte ein zweidimensionales Wörterbuch haben foound nur die zweite Dimension Wörterbücher wollen , die den Schlüssel enthalten bar. Eine relativ einfache Möglichkeit , dies zu tun wäre, eine verwenden Liste Verständnis mit einem bedingten wie folgt:

#!/bin/python
baz = dict([(key, value) for key, value in foo if bar in value])

Beachten Sie das if bar in valueam Ende der Anweisung ** Dies ist eine modifizierende Klausel , die das erzählte Liste Verständnis nur , um diese Schlüssel-Wert - Paare zu halten , die die bedingten erfüllen. ** In diesem Fall bazist ein neues Wörterbuch , das nur die Wörterbücher von foo enthält die Bar enthalten (Hoffentlich habe ich nichts in diesem Codebeispiel verpassen ... Sie können gefunden einen Blick auf die Liste Verständnis Dokumentation nehmen müssen docs.python.org Tutorials und secnetix.de , sind beide Standorte gute Referenzen , wenn Sie haben Fragen in der Zukunft.).

Beantwortet am 03/08/2008 um 16:47
quelle vom benutzer

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more