create - python list index
TypeError: el objeto ''dict_keys'' no admite indexación (5)
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 función de shuffle
, se produce el siguiente error, ¿por qué?
TypeError: ''dict_keys'' object does not support indexing
¿Por qué necesita implementar shuffle cuando ya existe? Quédate sobre los hombros de los gigantes.
import random
d1 = {0:''zero'', 1:''one'', 2:''two'', 3:''three'', 4:''four'',
5:''five'', 6:''six'', 7:''seven'', 8:''eight'', 9:''nine''}
keys = list(d1)
random.shuffle(keys)
d2 = {}
for key in keys: d2[key] = d1[key]
print(d1)
print(d2)
En Python 2 dict.keys () devuelve una lista, mientras que en Python 3 devuelve un generador.
Solo puede iterar sobre sus valores; de lo contrario, puede convertirlo explícitamente en una lista, es decir, pasarlo a una función de lista.
Está claro que está pasando d.keys()
a su función de shuffle
. Probablemente esto fue escrito con python2.x (cuando d.keys()
devolvió una lista). Con python3.x, d.keys()
devuelve un objeto dict_keys
que se comporta más como un set
que como una list
. Como tal, no puede ser indexado.
La solución es pasar la list(d.keys())
(o simplemente list(d)
) para shuffle
.
Está pasando el resultado de somedict.keys()
a la función. En Python 3, dict.keys
no devuelve una lista, pero un objeto similar a un conjunto que representa una vista de las teclas del diccionario y (al ser configurado) no admite la indexación.
Para solucionar el problema, use list(somedict.keys())
para recopilar las claves, y trabaje con eso.
convertir iterativo a la lista puede tener un costo en lugar de lo que puede usar
next(iter(keys))
para el primer artículo o si desea itrate todos los artículos utilizan
items = iter(keys)
while True:
try:
item = next(items)
except StopIteration as e:
pass # finish