Python: Überprüfen Sie, ob jedes Listenelement ist ein Schlüssel in einem Wörterbuch
Angesichts des folgenden code
all_options = { "1": "/test/1", "2": "/test/2", "3": "/test/3" }
selected_options = [ "1", "3" ]
Wie bekomme ich die Einträge aus all_options, wo der Schlüssel passt zu einem Eintrag in selected_options?
Begann ich den Weg mit einem Liste Verständnis, aber ich bin stecken geblieben auf der letzten Klausel:
final = ()
[ final.append(option) for option in all_options if ... ]
Danke
das ist der falsche Weg, zu verwenden Liste Verstehens. Sie sind die Schaffung eines großen Liste der Keiner ist, und werfen es Weg. Verwenden Sie einfach
final = [...]
InformationsquelleAutor Misha M | 2011-08-25
Schreibe einen Kommentar Antworten abbrechen
Du musst angemeldet sein, um einen Kommentar abzugeben.
Nur so?
Ab Python 2.7 und 3 ab, die Sie verwenden können, die dict-comprehension syntax:
Oder wenn Sie wollen einfach nur die Werte:
M: Ja. Ich aktualisiert meine Antwort.
Wollte gerade einen Kommentar dazu 🙂 Das hat wunderbar funktioniert, vielen Dank
Brauchen nicht die Liste Verständnis in der
dict
version, verwenden Sie einfach ein generator-Ausdruck.Danke. Aktualisiert.
InformationsquelleAutor Johnsyweb
Möchten Sie vielleicht, um eine
set
vonselected_options
und verwenden, statt wenn gibt es viele.nicht richtig" ist kein Grund.
Hmmm, ich hatte den Eindruck, dass der OP wollte eine Antwort, die entlang der Linien von dem, was Johnsyweb und ich schrieb, aber ich könnte falsch sein.
Gut, in gewisser Weise, ich hatte Recht =P
InformationsquelleAutor Ignacio Vazquez-Abrams
Mit Verständnis. Wir haben zwei Arten: Liste Verstehens-und generator-Verstehens.
Beachten Sie, dass dies hängt davon ab, was du damit meinst "Einträge". Wenn Sie möchten, eine
dict
mit den Schlüssel/Wert-Paaren entsprechen, dann müssen Sie ein Verständnis schafft, dass die Schlüssel/Wert-Paaren, und dann verwenden, um erstellen ein dict von der Einspeisung zu dendict
Konstruktor.Gibt es eine spezielle syntax-Regel, die besagt, dass wenn wir nennen etwas callable (wie, sagen wir, einen Konstruktor der Klasse) mit nur einem argument, und das argument ist eine generator-comprehension, dann brauchen wir nur ein paar von Klammern (anstelle von zwei: der eine, um die Funktion aufzurufen und eine andere zu markieren, das verstehen als Verständnis). Auf diese Weise können wir schreiben sehr natürlich aussehende Dinge.
Auf der anderen Seite, wenn Sie wollen einfach nur eine
list
Schlüssel, dann können Sie einfach eine Liste Verständnis. (Könnte passieren Sie eine generator-comprehension, dielist
Konstruktor, auch.)Haben Sie die falsche Vorstellung, die im wesentlichen darüber, wie Sie arbeiten. Sie verwenden Sie Sie nicht, um eine Aktion durchzuführen, wiederholt; Sie verwenden Sie zur Berechnung ein Ergebnis wiederholt. Sie würde nicht machen ein
append
Anruf in dem ersten Teil der Aussage, da (a) die Einsicht ist bereits die Sequenz für Sie, so dass es keinen Grund gibt, erstellen Sie eine weitere leere Sequenz anfügen; (b) dieappend
rufen Sie zurückNone
nach den Anhängen, so dass Sie am Ende eine Liste mit None-Werten, die Sie anschließend wegwerfen.Einer Liste Verständnis schafft einen Wert. Einen generator, der Verständnis schafft auch einen Wert, aber es ist ein generator (so haben Sie zum extrahieren der Werte, die Sie verwenden).
So, wie wir den code schreiben?
Einen
list
der Tasten sieht wie folgt aus: für jede Taste in derdict
(der Iteration über einedict
iteriert über dessen Tasten), wir wollen, dass die Taste (ohne Modifikation) nur, wenn die Schlüssel in unseren anderenlist
. Das heißt, wir wollen[key for key in all_options if key in selected_options]
. Und das ist genau, wie Sie es schreiben, in Python. Eine Sprache konnte kaum Lesen, mehr natürlich, während immer noch eindeutig.Einen
dict
von Schlüssel-Wert-Paare sieht wie folgt aus: für jedes Schlüssel-Wert-paar in der Schlüssel-Wert-Paare derdict
wir wollen, dass das paar nur, wenn die Schlüssel in unseren anderenlist
. Wir wollen einedict
mit diesen Schlüssel-Wert-Paare, also wir wickeln das Verständnis in derdict
Konstruktor. Um Schlüssel-Wert-Paare aus einem dict, wir iterieren über seine.items()
. Also, wir wollen einedict
konstruiert aus einem Schlüssel und einem Wert, für jeden Schlüssel und Wert in die Elemente der ursprünglichendict
, wo der Schlüssel ist in der anderenlist
. Und nochmal, das ist genau das, was wir schreiben:dict((key, value) for (key, value) in all_options if key in selected_options)
.In neueren Versionen von Python, wir können auch ein "dict-comprehension", die im Grunde ist syntaktischer Zucker, also können wir etwas schreiben, sieht eher aus wie die Liste Verständnis.
InformationsquelleAutor Karl Knechtel
Verwenden
set()
statt, und profitieren Sie von der Kreuzung Betrieb:Oben gibt nur die keys, aber NullUserException stellt fest, dass die Frage, können Sie den Wert als auch mit einem dict comprehention:
Vollständigkeit halber, hier ist nur den Wert:
Den unten falsch ist. Mit
set()
durchläuft beide Listen, statt nur einer.Bau die Sätze erfordern noch Durchlaufen die Container - aber das ist eine iteration über jeden, statt effektiv zu iterieren über das kartesische Produkt.
So ist es. Glaube nicht, das es so ist. Noch, die -1 vor kam sagte ich das.
InformationsquelleAutor Erik Youngren
Ich bin mir nicht sicher, welche genauen Inhalte Sie versuchen, zurückzukehren, so gebe ich ein paar Möglichkeiten:
wenn Ihr versucht zurück zu kehren: ['1', '3']
ODER
wenn Sie versuchen, zurück: ['/test/1', '/test/3']
InformationsquelleAutor Joe L.