spanish - Error de Python dictionary.keys()
pos tagging python spanish (5)
Estoy tratando de usar .keys()
y en lugar de obtener una lista de las claves como siempre he tenido en el pasado. Sin embargo, entiendo esto.
b = { ''video'':0, ''music'':23 }
k = b.keys()
print( k[0] )
>>>TypeError: ''dict_keys'' object does not support indexing
print( k )
dict_keys([''music'', ''video''])
debería simplemente imprimir [''música'', ''video''] a menos que me esté volviendo loco.
¿Que esta pasando?
Este es uno de los cambios más importantes entre Python 2 y 3.
En Python 2:
>>> help(dict.keys)
keys(...)
D.keys() -> list of D''s keys
En Python 3:
>>> help(dict.keys)
keys(...)
D.keys() -> a set-like object providing a view on D''s keys
Este cambio de comportamiento tiene mucho sentido ya que un dict está semánticamente desordenado y sus claves son únicas, como un conjunto.
Este cambio significa que no tiene que crear una nueva lista de claves cada vez que desee hacer algún tipo de comparación de conjuntos con las claves de un dict.
Obteniendo el mismo comportamiento en 2 y 3
Para ayudar a la transición a Python 3, Python 2.7 tiene otro método dict, viewkeys
. El método viewkeys
es más similar al método dict.keys
Python 3:
>>> d
{''a'': None, ''c'': None, ''b'': None, ''d'': None}
>>> for k in d.viewkeys(): print k
...
a
c
b
d
>>> d.viewkeys() & set(''abc'')
set([''a'', ''c'', ''b''])
En Python 3, el análogo más cercano al viejo comportamiento es pasar dict.keys()
a la list
:
>>> d
{''d'': None, ''a'': None, ''c'': None, ''b'': None}
>>> list(d.keys())
[''d'', ''a'', ''c'', ''b'']
O simplemente pasa el dict a la list
, ya que un dict iterará sobre sus claves de todos modos:
>>> list(d)
[''d'', ''a'', ''c'', ''b'']
Podría crear una función de utilidad para resumir el comportamiento sobre 2 y 3:
if hasattr(dict, ''viewkeys''): # Python 2.7
def keys(d):
return d.viewkeys()
else: # Python 3
def keys(d):
return d.keys()
Y pase un dict a la list
para obtener el formulario de la lista, y tanto en 2 como en 3, obtendrá el mismo resultado:
>>> d
{''b'': None, ''a'': None, ''c'': None, ''d'': None}
>>> keys(d)
dict_keys([''b'', ''a'', ''c'', ''d''])
>>> list(d)
[''b'', ''a'', ''c'', ''d'']
Python 3 cambió el comportamiento de dict.keys
modo que ahora devuelve un objeto dict_keys
, que es iterable pero no indexable (es como el antiguo dict.iterkeys
, que ya no está). Puede recuperar el resultado de Python 2 con una llamada explícita a la list
:
>>> b = { ''video'':0, ''music'':23 }
>>> k = list(b.keys())
>>> k
[''music'', ''video'']
o solo
>>> list(b)
[''music'', ''video'']
Si le asignó k
así lo hace:
k = list(b.keys())
tu código funcionará
Como dice el error, el tipo dict_keys
no admite indexación.
Si simplemente desea una lista de claves de un diccionario, puede hacerlo directamente de esta manera:
b = {"name": "xyz", "class":"abc", "college": "qwert"}
key_list = list(b)
key_list contendrá todos los nombres de las teclas como una lista, sin embargo, esto no repetirá una clave, si se encuentra más de una vez. Las claves duplicadas se contarán como una sola.
import random
b = { ''video'':0, ''music'':23,"picture":12 }
random.choice(tuple(b.items()))
# Returns a random dictionary entry as a tuple:
# (''music'', 23)