Ich möchte so etwas tun wie:
foo = {'foo':1,'zip':2,'zam':3,'bar':4}
if ("foo","bar") in foo:
#do stuff
Wie überprüfe ich, ob sowohl 'foo' als auch 'bar' in dict foo sind?
python
dictionary
Jean-François Corbett
quelle
quelle
set
ist er überlegen. Wie immer ... messen Sie es! -)Wenn Sie noch mit Python 2 arbeiten, können Sie dies tun
Wenn Sie noch auf einem wirklich alten Python <= 2.6 sind, können Sie
set
das Diktat aufrufen , aber es wird das gesamte Diktat durchlaufen, um das Set zu erstellen, und das ist langsam:quelle
set(("foo","bar")) <= myDict.keys()
was das temporäre Set vermeidet und somit viel schneller ist. Für meine Tests ist es ungefähr die gleiche Geschwindigkeit wie für alle, wenn die Abfrage 10 Elemente umfasste. Es wird jedoch langsamer, wenn die Abfrage größer wird.if {'foo', 'bar'} <= set(myDict): ...
Einfaches Benchmarking-Rig für 3 der Alternativen.
Geben Sie Ihre eigenen Werte für D und Q ein
quelle
d.viewkeys()
machenset(q) <= d.viewkeys()
.Python 2.7.5
hat auchd.keys()
Methode.set(q) <= ...
TypeError: can only compare to a set
. Es tut uns leid! :))d.viewkeys() >= set(q)
. Ich bin hierher gekommen, um herauszufinden, warum die Bestellung wichtig ist!Sie müssen die linke Seite nicht in ein Set einwickeln. Sie können dies einfach tun:
Dies ist auch besser als die
all(k in d...)
Lösung.quelle
Verwenden von Sets :
Alternative:
quelle
set(d)
ist das gleiche wieset(d.keys())
(ohne die Zwischenliste, died.keys()
konstruiert)Wie wäre es damit:
quelle
all
.Ich denke, das ist das klügste und markigste.
quelle
Obwohl ich Alex Martellis Antwort mag, scheint sie mir nicht pythonisch zu sein. Das heißt, ich dachte, ein wichtiger Teil des Pythonischen ist es, leicht verständlich zu sein. Mit diesem Ziel
<=
ist nicht leicht zu verstehen.Während es mehr Zeichen sind,
issubset()
ist es verständlicher, die von Karl Voigtland vorgeschlagene Antwort zu verwenden. Da diese Methode ein Wörterbuch als Argument verwenden kann, lautet eine kurze, verständliche Lösung:Ich würde gerne
{'foo', 'bar'}
anstelle von verwendenset(('foo', 'bar'))
, weil es kürzer ist. Es ist jedoch nicht so verständlich und ich denke, die Klammern sind zu leicht als Wörterbuch zu verwechseln.quelle
.issubset()
. Ich denke, in der Python-Dokumentation zu sein, macht es standardmäßig zu Pythonic.Die Lösung von Alex Martelli
set(queries) <= set(my_dict)
ist der kürzeste Code, aber möglicherweise nicht der schnellste. Angenommen, Q = len (Abfragen) und D = len (my_dict).Dies erfordert O (Q) + O (D), um die beiden Mengen zu erstellen, und dann (man hofft!) Nur O (min (Q, D)), um den Teilmengen-Test durchzuführen - vorausgesetzt natürlich, dass Python-Set-Lookup ist O (1) - dies ist der schlimmste Fall (wenn die Antwort wahr ist).
Die Generatorlösung von hughdbrown (et al?) Ist
all(k in my_dict for k in queries)
O (Q) im ungünstigsten Fall.Komplizierende Faktoren:
(1) Die Schleifen im satzbasierten Gadget werden alle mit C-Geschwindigkeit ausgeführt, während das beliebige Gadget den Bytecode durchläuft.
(2) Der Aufrufer des beliebigen Gadgets kann möglicherweise jede Kenntnis der Wahrscheinlichkeit eines Fehlers nutzen, um die Abfrageelemente entsprechend zu ordnen, während das satzbasierte Gadget keine solche Steuerung zulässt.
Wenn Geschwindigkeit wichtig ist, ist wie immer ein Benchmarking unter Betriebsbedingungen eine gute Idee.
quelle
Sie können mit .issubset () als auch
quelle
Wie wäre es mit Lambda?
quelle
Falls Sie möchten:
dann:
quelle
Um nicht zu behaupten, dass dies nicht etwas ist, an das Sie nicht gedacht haben, aber ich finde, dass das Einfachste normalerweise das Beste ist:
quelle
Jason, () sind in Python nicht notwendig.
quelle
Nur meine Meinung dazu, es gibt zwei Methoden, die für alle gegebenen Optionen leicht zu verstehen sind. Mein Hauptkriterium ist also, gut lesbaren Code zu haben, nicht außergewöhnlich schnellen Code. Um den Code verständlich zu halten, bevorzuge ich gegebene Möglichkeiten:
Die Tatsache, dass "var <= var2.keys ()" in meinen Tests unten schneller ausgeführt wird, bevorzuge ich diesen.
quelle
Wenn festgestellt wird, ob nur einige Schlüssel übereinstimmen, funktioniert dies:
Eine weitere Option, um festzustellen, ob nur einige Schlüssel übereinstimmen:
quelle
Eine weitere Option, um festzustellen, ob sich alle Schlüssel in einem Diktat befinden:
quelle
Das scheint zu funktionieren
quelle
()
, dass das zuerst ausgewertet werden und dazu führenTrue
würde, was dann prüfen würde, obTrue in ok
. Wie funktioniert das eigentlich?!