Pregunta simple: ¿Existe una forma abreviada de verificar la existencia de varias claves en un diccionario?¿Atajo de teclas Python en un diccionario?
'foo' in dct and 'bar' in dct and 'baz' in dct
Pregunta simple: ¿Existe una forma abreviada de verificar la existencia de varias claves en un diccionario?¿Atajo de teclas Python en un diccionario?
'foo' in dct and 'bar' in dct and 'baz' in dct
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).
all(x in dct for x in ('foo','bar','baz'))
Muy bonito. ¡Gracias! – davidchambers
+1 que es sexy ... – sholsapp
{"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()
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). –
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
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 :) –
Aceptando esta respuesta gracias a la inclusión de enlaces útiles. :) – davidchambers
... aunque repite la respuesta anterior de @ unutbu. –
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