example - python plot numpy array




Verwenden von 'in', um ein Attribut von Python-Objekten in einem Array zuzuordnen (6)

Ich denke:

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

Ist was du denkst. Wenn Sie versuchen, festzustellen, ob ein bestimmter Schlüssel in einem Wörterbuch in Python existiert (Python-Version einer Hash-Tabelle), gibt es zwei Möglichkeiten, dies zu überprüfen. Erstens ist die Methode has_key() an das Wörterbuch angehängt und zweitens das oben angegebene Beispiel. Es wird ein boolescher Wert zurückgegeben.

Das sollte deine Frage beantworten.

Und jetzt ein wenig Off-Topic, um dies in die zuvor gegebene Liste Verständnis Antwort (für ein bisschen mehr Klarheit) zu binden. List Comprehensions erstellt eine Liste aus einer einfachen for-Schleife mit Modifikatoren. Als ein Beispiel (um etwas zu verdeutlichen), eine Möglichkeit, das in dict Sprachkonstrukt in einem Listenverständnis zu verwenden :

Angenommen, Sie haben ein zweidimensionales Wörterbuch- foo und möchten nur die Wörterbücher der zweiten Dimension, die die Schlüsselleiste enthalten. Ein relativ einfacher Weg wäre, ein Listenverständnis mit einer Bedingung wie folgt zu verwenden:

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

Beachten Sie den if bar in value am Ende der Anweisung **, dies ist eine modifizierende Klausel, die dem Listenverstehen mitteilt, nur jene Schlüssel-Wert-Paare zu behalten, die die Bedingung erfüllen. ** In diesem Fall ist baz ein neues Wörterbuch, das nur die Wörterbücher von foo, die bar enthalten (Hoffentlich habe ich in diesem Codebeispiel nichts verpasst ... vielleicht müssen Sie sich die Dokumentation zum Verständnis des Verzeichnisses ansehen, die Sie in den docs.python.org-Tutorials und auf secnetix.de finden , beides Websites sind gute Referenzen, wenn Sie in Zukunft Fragen haben.

Ich erinnere mich nicht, ob ich träumte oder nicht, aber ich erinnere mich, dass es eine Funktion gab, die etwas wie

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

Ich habe mir die Dokumente angesehen, aber so etwas fällt nicht unter die offensichtlichen Kopfzeilen


Suchen Sie nach einer Liste von Objekten mit einem bestimmten Attribut? Wenn dies der Fall ist, ist ein Listenverständnis der richtige Weg, dies zu tun.

result = [obj for obj in listOfObjs if hasattr(obj, 'attributeName')]

Wenn Sie vorhaben, irgendetwas von einer fernen Größe zu suchen, wird Ihre beste Wette sein, ein Wörterbuch oder ein Set zu verwenden. Andernfalls müssen Sie grundsätzlich durch jedes Element des Iterators iterieren, bis Sie zu dem gewünschten Ergebnis gelangen.

Wenn dies nicht unbedingt ein leistungsempfindlicher Code ist, sollte der Listenverstehensweg funktionieren. Aber beachten Sie, dass es ziemlich ineffizient ist, weil es über jedes Element des Iterators geht und dann wieder darüber geht, bis es findet, was es will.

Denken Sie daran, Python hat einen der effizientesten Hashalgorithmen. Nutzen Sie es zu Ihrem Vorteil.


du könntest immer selbst schreiben:

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

wird mit allem arbeiten, was iteriert, sei es ein Tupel, eine Liste oder was auch immer.

Ich liebe Python, es macht Sachen wie diese sehr einfach und nicht mehr mühsam als notwendig, und im Gebrauch ist solches Zeug ungeheuer elegant.


Die Funktion, an die Sie denken, ist wahrscheinlich operator.attrgettter . Um beispielsweise eine Liste zu erhalten, die den Wert des "id" -Attributs jedes Objekts enthält:

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

Wenn Sie prüfen möchten, ob die Liste ein Objekt mit einer ID == 12 enthält, dann ist ein ordentliches und effizientes Verfahren (dh die ganze Liste wird nicht unnötig durchlaufen) ein Weg, dies zu tun:

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

Wenn Sie 'in' mit attrgetter verwenden möchten, während Sie die faulere Iteration der Liste beibehalten:

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


Nein, du hast nicht geträumt. Python hat ein ziemlich gutes Listenverständnis-System, mit dem Sie Listen ziemlich elegant manipulieren können, und je nachdem, was Sie erreichen wollen, kann dies auf verschiedene Arten geschehen. Im Wesentlichen sagen Sie "Für ein Element in der Liste, wenn criteria.matches", und Sie können dann einfach durch die Ergebnisse iterieren oder die Ergebnisse in einer neuen Liste ablegen.

Ich werde hier ein Beispiel von Dive Into Python finden, weil es ziemlich elegant ist und sie klüger sind als ich. Hier erhalten sie eine Liste von Dateien in einem Verzeichnis und filtern dann die Liste nach allen Dateien, die einem regulären Ausdruck entsprechen.

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

Sie könnten dies ohne reguläre Ausdrücke für Ihr Beispiel tun, für alles, wo Ihr Ausdruck am Ende für eine Übereinstimmung true zurückgibt. Es gibt andere Optionen wie die filter () - Funktion, aber wenn ich mich entscheiden würde, würde ich damit umgehen.

Eric Sipple





iteration