Quiero hacer algo como:
foo = {'foo':1,'zip':2,'zam':3,'bar':4}
if ("foo","bar") in foo:
#do stuff
¿Cómo verifico si tanto 'foo' como 'bar' están en dict foo?
python
dictionary
Jean-François Corbett
fuente
fuente
set
es superior. Como de costumbre ... ¡mídelo! -)Si todavía estás en Python 2, puedes hacer
Si todavía está en un Python <= 2.6 muy antiguo, puede invocar
set
el dict, pero iterará sobre todo el dict para construir el conjunto, y eso es lento:fuente
set(("foo","bar")) <= myDict.keys()
qué evita el conjunto temporal, por lo que es mucho más rápido. Para mi prueba, tiene aproximadamente la misma velocidad que usar todo cuando la consulta tenía 10 elementos. Sin embargo, se vuelve más lento a medida que la consulta se hace más grande.if {'foo', 'bar'} <= set(myDict): ...
Plataforma de evaluación comparativa simple para 3 de las alternativas.
Ponga sus propios valores para D y Q
fuente
d.viewkeys()
que hacerset(q) <= d.viewkeys()
.Python 2.7.5
Tiened.keys()
método también.set(q) <= ...
TypeError: can only compare to a set
. ¡Lo siento! :))d.viewkeys() >= set(q)
. ¡Vine aquí tratando de averiguar por qué importa el orden!No tiene que envolver el lado izquierdo en un conjunto. Puedes hacer esto:
Esto también funciona mejor que la
all(k in d...)
solución.fuente
Usando conjuntos :
Alternativamente:
fuente
set(d)
es lo mismo queset(d.keys())
(sin la lista intermedia qued.keys()
construye)Qué tal esto:
fuente
all
.Creo que este es el más inteligente y decisivo.
fuente
Si bien me gusta la respuesta de Alex Martelli, no me parece Pythonic. Es decir, pensé que una parte importante de ser Pythonic es ser fácilmente comprensible. Con ese objetivo,
<=
no es fácil de entender.Si bien son más personajes,
issubset()
es más comprensible usar como lo sugiere la respuesta de Karl Voigtland. Dado que ese método puede usar un diccionario como argumento, una solución breve y comprensible es:Me gustaría usar
{'foo', 'bar'}
en lugar deset(('foo', 'bar'))
, porque es más corto. Sin embargo, no es tan comprensible y creo que las llaves se confunden demasiado fácilmente como un diccionario.fuente
.issubset()
. Creo que estar en la documentación de Python lo hace Pythonic por defecto.La solución de Alex Martelli
set(queries) <= set(my_dict)
es el código más corto pero puede no ser el más rápido. Suponga Q = len (consultas) y D = len (my_dict).Esto toma O (Q) + O (D) para hacer los dos conjuntos, y luego (¡uno espera!) Solo O (min (Q, D)) para hacer la prueba de subconjunto, suponiendo, por supuesto, que la búsqueda de conjuntos de Python es O (1): este es el peor de los casos (cuando la respuesta es verdadera).
La solución generadora de hughdbrown (et al?)
all(k in my_dict for k in queries)
Es el peor de los casos O (Q).Factores complicados:
(1) todos los bucles en el gadget basado en conjuntos se realizan a velocidad C, mientras que el gadget basado en cualquier se repite en código de bytes.
(2) La persona que llama del gadget basado en cualquier puede usar cualquier conocimiento de probabilidad de falla para ordenar los elementos de consulta en consecuencia, mientras que el gadget basado en conjunto no permite tal control.
Como siempre, si la velocidad es importante, la evaluación comparativa en condiciones operativas es una buena idea.
fuente
Puede usar .issubset () también
fuente
¿Qué tal usar lambda?
fuente
En caso de que quieras:
luego:
fuente
No para sugerir que esto no es algo en lo que no haya pensado, pero creo que lo más simple suele ser lo mejor:
fuente
Jason, () no son necesarios en Python.
fuente
Solo mi opinión sobre esto, hay dos métodos que son fáciles de entender de todas las opciones dadas. Entonces, mi criterio principal es tener un código muy legible, no un código excepcionalmente rápido. Para mantener el código comprensible, prefiero las posibilidades dadas:
El hecho de que "var <= var2.keys ()" se ejecuta más rápido en mis pruebas a continuación, prefiero este.
fuente
En el caso de determinar si solo algunas teclas coinciden, esto funciona:
Otra opción más para encontrar si solo algunas teclas coinciden:
fuente
Otra opción para detectar si todas las claves están en un dict:
fuente
Esto parece funcionar
fuente
()
serían evaluados primero y dar como resultadoTrue
, que luego comprobar siTrue in ok
. ¿Cómo funciona esto realmente?