Las vistas de diccionario son esencialmente lo que dice su nombre: las vistas son simplemente como una ventana en las claves y valores (o elementos) de un diccionario. Aquí hay un extracto de la documentación oficial de Python 3:
>>> dishes = {'eggs': 2, 'sausage': 1, 'bacon': 1, 'spam': 500}
>>> keys = dishes.keys()
>>> values = dishes.values()
>>> # view objects are dynamic and reflect dict changes
>>> del dishes['eggs']
>>> keys # No eggs anymore!
dict_keys(['sausage', 'bacon', 'spam'])
>>> values # No eggs value (2) anymore!
dict_values([1, 1, 500])
(Los usos equivalentes de Python 2 dishes.viewkeys()
ydishes.viewvalues()
.)
Este ejemplo muestra el carácter dinámico de las vistas : la vista de teclas no es una copia de las teclas en un momento dado, sino una ventana simple que le muestra las teclas; si se cambian, entonces lo que ves a través de la ventana también cambia. Esta característica puede ser útil en algunas circunstancias (por ejemplo, se puede trabajar con una vista de las teclas en varias partes de un programa en lugar de volver a calcular la lista actual de teclas cada vez que se necesitan); tenga en cuenta que si se modifican las teclas del diccionario al iterar sobre la vista, el comportamiento del iterador no está bien definido, lo que puede provocar errores .
Una ventaja es que mirar , por ejemplo, las teclas usa solo una cantidad pequeña y fija de memoria y requiere una cantidad pequeña y fija de tiempo de procesador , ya que no se crea una lista de teclas (Python 2, por otro lado, a menudo crea innecesariamente una nueva lista, como lo cita Rajendran T, que requiere memoria y tiempo en una cantidad proporcional a la longitud de la lista). Para continuar con la analogía de la ventana, si desea ver un paisaje detrás de una pared, simplemente haga una abertura en ella (construye una ventana); copiar las claves en una lista correspondería en lugar de pintar una copia del paisaje en su pared: la copia lleva tiempo, espacio y no se actualiza sola.
Para resumir, las vistas son simplemente ... vistas (ventanas) en su diccionario, que muestran el contenido del diccionario incluso después de que cambie. Ofrecen características que difieren de las de las listas: una lista de claves contiene una copia de las claves del diccionario en un momento dado, mientras que una vista es dinámica y es mucho más rápida de obtener, ya que no tiene que copiar ningún dato ( claves o valores) para ser creados.
Como mencionó,
dict.items()
devuelve una copia de la lista del diccionario de pares (clave, valor) que es un desperdicio ydict.iteritems()
devuelve un iterador sobre los pares del diccionario (clave, valor).Ahora tome el siguiente ejemplo para ver la diferencia entre un interador de dict y una vista de dict
Mientras que una vista simplemente muestra lo que hay en el dict. No le importa si cambió:
Una vista es simplemente como se ve el diccionario ahora. Después de eliminar una entrada, no
.items()
estaría actualizada y.iteritems()
habría arrojado un error.fuente
viewitems()
es realmente correcta (items()
da una vista correcta en Python 3 ).Solo de leer los documentos me da esta impresión:
Entonces, supongo que el caso de uso de la clave es si está manteniendo un diccionario alrededor e iterando repetidamente sobre sus claves / elementos / valores con modificaciones en el medio. En su lugar, podría usar una vista, convirtiéndose
for k, v in mydict.iteritems():
enfor k, v in myview:
. Pero si solo está iterando sobre el diccionario una vez, creo que las versiones iter siguen siendo preferibles.fuente
iteritems()
). Entonces, ¿cuál es el punto de estas opiniones? ¿Cuándo estoy feliz de tenerlos?.values()
, pero eso implica hacer una copia completa como una lista, lo que podría ser costoso. Hay.itervalues()
pero no puede consumirlos más de una vez, por lo que no funcionará con todas las funciones. Las vistas no requieren una copia costosa, pero siguen siendo más útiles como valor independiente que como iterador. Pero todavía no tienen la intención de ayudar a iterar y modificar al mismo tiempo (allí realmente quieres una copia).Los métodos de visualización devuelven una lista (no una copia de la lista, en comparación con
.keys()
,.items()
y.values()
), por lo que es más liviana, pero refleja el contenido actual del diccionario.Desde Python 3.0: los métodos dict devuelven vistas, ¿por qué?
fuente
Las vistas le permiten acceder a la estructura de datos subyacentes, sin copiarla. Además de ser dinámico en lugar de crear una lista, uno de sus usos más útiles es la
in
prueba. Digamos que desea verificar si un valor está en el dict o no (ya sea clave o valor).La opción uno es crear una lista de las teclas usando
dict.keys()
, esto funciona pero obviamente consume más memoria. Si el dict es muy grande? Eso sería un desperdicio.Con
views
usted puede iterar la estructura de datos real, sin una lista intermedia.Usemos ejemplos. Tengo un dict con 1000 claves de cadenas y dígitos aleatorios y
k
es la clave que quiero buscarComo puede ver, la iteración de
view
objetos da un gran impulso al rendimiento, reduciendo la sobrecarga de memoria al mismo tiempo. Debe usarlos cuando necesite realizarSet
operaciones similares.Nota : estoy corriendo en Python 2.7
fuente
.keys()
devuelve una vista por defecto. Puede que quiera comprobarlo dos vecesk
una de las claves del diccionariolarge_d
se debe hacerk in large_d
, en Python, que probablemente sea tan rápido como usar una vista (en otras palabras,k in large_d.keys()
no es Pythonic y debería evitarse) como esk in large_d.viewkeys()
)k in large_d
en realidad es significativamente más rápido quek in large_d.viewkeys()
, por lo que probablemente debería evitarse, pero esto tiene sentidok in large_d.viewvalues()
.