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 shufflefunció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 tushufflefunción. Probablemente esto fue escrito con python2.x (cuando sed.keys()devuelve una lista). Con python3.x,d.keys()devuelve undict_keysobjeto que se comporta mucho más como asetque 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_keysobjeto 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.shufflees 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.shufflela implementación de la biblioteca estándar :-)Estás pasando el resultado de
somedict.keys()a la función. En Python 3,dict.keysno 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