168 votes

TypeError : L'objet 'dict_keys' ne supporte pas l'indexation.

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]

Lorsque je lance le shuffle l'erreur suivante se produit, pourquoi ?

TypeError: 'dict_keys' object does not support indexing

264voto

mgilson Points 92954

Il est clair que vous passez dans d.keys() a su shuffle fonction. Ceci a probablement été écrit avec python2.x (quand d.keys() a retourné une liste). Avec python3.x, d.keys() renvoie un dict_keys qui se comporte beaucoup plus comme un set qu'un list . En tant que tel, il ne peut pas être indexé.

La solution consiste à passer list(d.keys()) (ou simplement list(d) ) à shuffle .

13voto

user4815162342 Points 27348

Vous passez le résultat de somedict.keys() à la fonction. Dans Python 3, dict.keys ne retourne pas une liste, mais un objet de type ensemble qui représente une vue des clés du dictionnaire et (étant de type ensemble) ne supporte pas l'indexation.

Pour résoudre le problème, utilisez list(somedict.keys()) pour collecter les clés, et travailler avec ça.

13voto

sahama Points 364

Convertir un itérable en liste peut avoir un coût. Au lieu de cela, pour obtenir le premier élément, vous pouvez utiliser :

next(iter(keys))

Ou, si vous voulez itérer sur tous les éléments, vous pouvez utiliser :

items = iter(keys)
while True:
    try:
        item = next(items)
    except StopIteration as e:
        pass # finish

1voto

DeWil Points 102

En Python 2, dict.keys() retourne une liste, alors qu'en Python 3, il retourne un générateur.

Vous pouvez seulement itérer sur ses valeurs, sinon vous devrez explicitement le convertir en liste, c'est-à-dire le passer à une fonction de liste.

0voto

foo bar Points 747

Pourquoi faut-il implémenter le shuffle alors qu'il existe déjà ? Restez sur les épaules des géants.

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)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X