index create comprehension python python-3.x dictionary

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