2011-08-13 19 views

Respuesta

7

Puede utilizar all() con un generator expression:

>>> all(x in dct for x in ('foo', 'bar', 'qux')) 
False 
>>> all(x in dct for x in ('foo', 'bar', 'baz')) 
True 
>>> 

Esto le ahorra la friolera de 2 caracteres (pero le ahorrará mucho más si usted tiene una lista más larga para comprobar).

+1

Aceptando esta respuesta gracias a la inclusión de enlaces útiles. :) – davidchambers

+0

... aunque repite la respuesta anterior de @ unutbu. –

+0

ovejas @flying: No hubo respuestas cuando comencé a escribir el mío. Supongo que unutbu comenzó y terminó de escribir mientras yo creaba ejemplos positivos y negativos y agregaba algunas referencias enlazadas. [es decir. No copié su tarea ;-)] – Johnsyweb

5
{"foo","bar","baz"}.issubset(dct.keys()) 

para Python 2.7 <, usted tiene que reemplazar el conjunto literal con set(["foo","bar","baz"])

Si te gusta operadores y no les importa el rendimiento de crear otro conjunto, puede utilizar el operador de <= el conjunto y el conjunto de claves del dict.

Ambas variaciones combinadas se vería así:

set(["foo","bar","baz"]) <= set(dct) 

Por último, si se utiliza Python 3, dict.keys() devolverá un objeto setlike, lo que significa que se puede llamar al operador sin penalización en el rendimiento de esta manera:

{"foo","bar","baz"} <= dct.keys() 
+0

Esta es una alternativa clara, y demuestra en mi humilde opinión que TIMTOWTDI es ineludible; desafortunadamente, 'set' en <= 2.6 no toma' * args' - necesita pasar una secuencia explícitamente (otro conjunto de corchetes). –

+1

Esto será O (n) en lugar de O (1) para los demás. Ni siquiera tiene que ser holandés para ver lo horrible que será si el dict es muy grande. – geoffspear

+0

Gracias por el error en la llamada al constructor del conjunto y por mencionar al operador. No creo que O (n) duela en el caso del OP, sin embargo, ya que él se va lejos de verificar manualmente cada clave :) –

Cuestiones relacionadas