Gibt es in Python 2.7+ eine Möglichkeit, Folgendes zu erstellen?
{ something_if_true if condition else something_if_false for key, value in dict_.items() }
Ich weiß, dass Sie alles nur mit 'wenn' machen können:
{ something_if_true for key, value in dict_.items() if condition}
python
dictionary
dictionary-comprehension
diegueus9
quelle
quelle
dict
besteht a auskey:value
Elementen, Sie bauen keindict
hier, sondern einset
(siehe Set-Literale ).Antworten:
Sie haben es bereits:
A if test else B
ist ein gültiger Python-Ausdruck. Das einzige Problem mit Ihrem Diktatverständnis, wie gezeigt, besteht darin, dass die Stelle für einen Ausdruck in einem Diktatverständnis zwei Ausdrücke haben muss, die durch einen Doppelpunkt getrennt sind:Die letzte
if
Klausel fungiert als Filter, der sich vom bedingten Ausdruck unterscheidet.quelle
{(a if condition else b): value for key, value in dict.items()}
wird funktionieren.@ Marcins Antwort deckt alles ab, aber für den Fall, dass jemand ein aktuelles Beispiel sehen möchte, füge ich unten zwei hinzu:
Angenommen, Sie haben das folgende Mengenwörterbuch
und Sie möchten ein neues Wörterbuch erstellen, dessen Schlüssel angeben, ob die Zeichenfolge
'a'
in den Werten enthalten ist oder nichtwas ergibt
Nehmen wir nun an, Sie haben zwei Wörterbücher wie dieses
und Sie möchten die Schlüssel
d1
durch die Schlüssel ersetzen.d2
Wenn die jeweiligen Werte identisch sind, können Sie dies tunwas gibt
quelle
d1
,d2
erhalte ichAttributeError: 'dict_values' object has no attribute 'index'
Falls Sie unterschiedliche Bedingungen für die Bewertung von Schlüsseln und Werten haben, ist die Antwort von @ Marcin der richtige Weg.
Wenn Sie die gleiche Bedingung für Schlüssel und Werte haben, ist es besser, wenn Sie (Schlüssel, Wert) -Tupel in einem Generatorausdruck erstellen, der Folgendes eingibt
dict()
:Es ist einfacher zu lesen und die Bedingung wird nur einmal pro Schlüsselwert bewertet.
Beispiel mit dem Ausleihen von @ Clebs Set-Wörterbuch:
Angenommen , Sie nur Suffix wollen
keys
mita
in seinevalue
und Sie wollen , dass dievalue
mit der Länge des Satzes in einem solchen Fall ersetzt. Andernfalls sollte das Schlüssel-Wert-Paar unverändert bleiben.quelle
Ein weiteres Beispiel für die Verwendung von if / else im Wörterbuchverständnis
Ich arbeite an einer Dateneingabe-Desktop-Anwendung für meine eigene Büroarbeit, und es ist üblich, dass eine solche Dateneingabe-Anwendung alle Einträge vom Eingabe-Widget abruft und sie zur weiteren Verarbeitung wie Validierung oder Bearbeitung, die wir zurückgeben müssen, in ein Wörterbuch kopiert ausgewählte Daten aus der Datei zurück zu Eintrags-Widgets usw.
Die erste Runde mit traditioneller Codierung (8 Zeilen):
Zweite Runde Ich habe versucht, das Wörterbuchverständnis zu verwenden, aber die Schleife ist immer noch da (6 Zeilen):
Schließlich mit einer einzeiligen Wörterbuchverständniserklärung (1 Zeile):
Ich benutze Python 3.8.3
quelle