def shuffle(self, x, random=None, int=int):
"""x, random=random.random -> shuffle list x in place; return None.
Optional arg random is a 0-argument function returning a random
float in [0.0, 1.0); by default, the standard random.random.
"""
randbelow = self._randbelow
for i in reversed(range(1, len(x))):
# pick an element in x[:i+1] with which to exchange x[i]
j = randbelow(i+1) if random is None else int(random() * (i+1))
x[i], x[j] = x[j], x[i]
Cuando ejecuto la shuffle
función, aparece el siguiente error, ¿por qué es eso?
TypeError: 'dict_keys' object does not support indexing
python
python-3.x
dictionary
gate_007
fuente
fuente
Respuestas:
Claramente estás pasando
d.keys()
a tushuffle
función. Probablemente esto fue escrito con python2.x (cuando sed.keys()
devuelve una lista). Con python3.x,d.keys()
devuelve undict_keys
objeto que se comporta mucho más como aset
que alist
. Como tal, no se puede indexar.La solución es pasar
list(d.keys())
(o simplementelist(d)
) ashuffle
.fuente
list(d)
que le dará una lista de claves en python2.xy python3.x sin hacer ninguna copia :-)dict_keys
objeto se comporta mucho más como las teclas de la mitad de un dict. Específicamente, admiten pruebas de membresía O (1) (y otros métodos similares a conjuntos que se pueden implementar de manera eficiente además de ese hecho). Estas cosas no son posibles con una lista y si desea una lista de las claves del dict, siempre ha podido hacerlist(your_dictionary)
para obtenerla.shuffle
es el nombre de la función en el código del póster original (la función que arroja el error). Al mirar el código, creo que fue copiado / pegado derandom.shuffle
la implementación de la biblioteca estándar :-)Estás pasando el resultado de
somedict.keys()
a la función. En Python 3,dict.keys
no devuelve una lista, pero un objeto tipo conjunto que representa una vista de las teclas del diccionario y (al ser tipo conjunto) no admite la indexación.Para solucionar el problema, use
list(somedict.keys())
para recoger las claves y trabaje con eso.fuente
Convertir un iterable en una lista puede tener un costo. En cambio, para obtener el primer elemento, puede usar:
O, si desea iterar sobre todos los elementos, puede usar:
fuente
¿Por qué necesita implementar shuffle cuando ya existe? Mantente sobre los hombros de los gigantes.
fuente
En Python 2, dict.keys () devuelve una lista, mientras que en Python 3 devuelve un generador.
Solo podría iterar sobre sus valores; de lo contrario, tendrá que convertirlo explícitamente en una lista, es decir, pasarlo a una función de lista.
fuente