Je veux faire quelque chose comme:
foo = {'foo':1,'zip':2,'zam':3,'bar':4}
if ("foo","bar") in foo:
#do stuff
Comment vérifier si 'foo' et 'bar' sont bien dans dict foo?
python
dictionary
Jean-François Corbett
la source
la source
set
est supérieur. Comme d'habitude ... mesurez-le! -)Si vous êtes toujours sur Python 2, vous pouvez le faire
Si vous êtes toujours sur très ancien Python <= 2.6, vous pouvez faire appel
set
au dict, mais il itérera sur tout le dict pour construire l'ensemble, et c'est lent:la source
set(("foo","bar")) <= myDict.keys()
ce qui évite l'ensemble temporaire, c'est donc beaucoup plus rapide. Pour mes tests, c'est à peu près la même vitesse que l'utilisation de all lorsque la requête était de 10 éléments. Cela devient plus lent à mesure que la requête grossit.if {'foo', 'bar'} <= set(myDict): ...
Plateforme de benchmarking simple pour 3 des alternatives.
Mettez vos propres valeurs pour D et Q
la source
d.viewkeys()
faireset(q) <= d.viewkeys()
.Python 2.7.5
ad.keys()
aussi la méthode.set(q) <= ...
TypeError: can only compare to a set
. Désolé! :))d.viewkeys() >= set(q)
. Je suis venu ici pour essayer de comprendre pourquoi la commande était importante!Vous n'avez pas à envelopper le côté gauche dans un ensemble. Vous pouvez simplement faire ceci:
Cela fonctionne également mieux que la
all(k in d...)
solution.la source
Utilisation d' ensembles :
Alternativement:
la source
set(d)
est le même queset(d.keys())
(sans la liste intermédiaire quid.keys()
construit)Que dis-tu de ça:
la source
all
.Je pense que c'est le plus intelligent et le plus pithonique.
la source
Bien que j'aime la réponse d'Alex Martelli, elle ne me semble pas pythonique. Autrement dit, je pensais qu'une partie importante d'être Pythonique est d'être facilement compréhensible. Avec cet objectif,
<=
n'est pas facile à comprendre.Bien qu'il s'agisse de plus de caractères, l'utilisation
issubset()
comme suggéré par la réponse de Karl Voigtland est plus compréhensible. Puisque cette méthode peut utiliser un dictionnaire comme argument, une solution courte et compréhensible est:Je voudrais utiliser
{'foo', 'bar'}
à la place deset(('foo', 'bar'))
, car il est plus court. Cependant, ce n'est pas si compréhensible et je pense que les accolades sont trop facilement confondues comme étant un dictionnaire.la source
.issubset()
. Je pense qu'être dans la documentation Python en fait Pythonic par défaut.La solution d'Alex Martelli
set(queries) <= set(my_dict)
est le code le plus court mais peut-être pas le plus rapide. Supposons Q = len (requêtes) et D = len (my_dict).Cela prend O (Q) + O (D) pour faire les deux ensembles, puis (on espère!) Seulement O (min (Q, D)) pour faire le test du sous-ensemble - en supposant bien sûr que la recherche de l'ensemble Python est O (1) - c'est le pire des cas (lorsque la réponse est vraie).
La solution de générateur de hughdbrown (et al?)
all(k in my_dict for k in queries)
Est le pire des cas O (Q).Facteurs de complication:
(1) les boucles dans le gadget basé sur l'ensemble sont toutes effectuées à la vitesse C tandis que le gadget basé sur n'importe quelle boucle passe par le bytecode.
(2) L'appelant du gadget à base quelconque peut être en mesure d'utiliser n'importe quelle connaissance de la probabilité d'échec pour ordonner les éléments de requête en conséquence alors que le gadget à base d'ensemble ne permet aucun contrôle de ce type.
Comme toujours, si la vitesse est importante, l'analyse comparative dans des conditions opérationnelles est une bonne idée.
la source
Vous pouvez utiliser .issubset () et
la source
Que diriez-vous d'utiliser lambda?
la source
Si vous souhaitez:
puis:
la source
Pour ne pas suggérer que ce n'est pas quelque chose auquel vous n'avez pas pensé, mais je trouve que la chose la plus simple est généralement la meilleure:
la source
Jason, () n'est pas nécessaire en Python.
la source
Juste mon avis à ce sujet, il existe deux méthodes faciles à comprendre pour toutes les options données. Donc, mon critère principal est d'avoir un code très lisible, pas un code exceptionnellement rapide. Pour garder le code compréhensible, je préfère les possibilités données:
Le fait que "var <= var2.keys ()" s'exécute plus rapidement dans mes tests ci-dessous, je préfère celui-ci.
la source
Dans le cas de déterminer si seules certaines clés correspondent, cela fonctionne:
Encore une autre option pour trouver si seules certaines clés correspondent:
la source
Une autre option pour détecter si toutes les clés sont dans un dict:
la source
Cela semble fonctionner
la source
()
serait évalué et qu'il en résulteraitTrue
, ce qui vérifierait ensuite siTrue in ok
. Comment cela fonctionne-t-il réellement?!