Este es uno de los cambios de ruptura 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 de 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 teclas de un dict.
Conseguir 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 a dict.keys
método de 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 comportamiento anterior es pasar dict.keys()
a list
:
>>> d
{'d': None, 'a': None, 'c': None, 'b': None}
>>> list(d.keys())
['d', 'a', 'c', 'b']
O simplemente pasar el dict a list
, ya que un diccionario será iterar sobre sus claves de todos modos:
>>> list(d)
['d', 'a', 'c', 'b']
Usted podría cr eate unas funciones de utilidad para abstraer el comportamiento a lo largo 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 pasar un diccionario de list
para obtener el formulario de lista, y en ambos 2 y 3, que 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']
Ya que nadie vinculado la documentación oficial, lo haré: [** Diccionario Vista del objeto **] (http: //docs.python. org/py3k/library/stdtypes.html # dictionary-view-objects). –
Tenga en cuenta que los diccionarios no están ordenados, de modo que b.keys() [0] generalmente no es una tarea muy útil. –