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 j'exécute la shuffle
fonction, cela génère l'erreur suivante, pourquoi?
TypeError: 'dict_keys' object does not support indexing
python
python-3.x
dictionary
gate_007
la source
la source
Réponses:
De toute évidence, vous passez
d.keys()
à votreshuffle
fonction. Cela a probablement été écrit avec python2.x (lorsqued.keys()
renvoyé une liste). Avec python3.x,d.keys()
renvoie undict_keys
objet qui se comporte beaucoup plus commeset
unlist
. En tant que tel, il ne peut pas être indexé.La solution est de passer
list(d.keys())
(ou simplementlist(d)
) àshuffle
.la source
list(d)
ce qui vous donnera une liste de clés sur python2.x et python3.x sans faire de copies :-)dict_keys
objet se comporte beaucoup plus comme juste la moitié des clés d'un dict. Plus précisément, ils prennent en charge les tests d'appartenance O (1) (et d'autres méthodes de type ensemble qui peuvent être mises en œuvre efficacement en plus de ce fait). Ces choses ne sont pas possibles avec une liste et si vous voulez une liste des clés du dict, vous avez toujours été capable de faire simplementlist(your_dictionary)
pour l'obtenir.shuffle
est le nom de la fonction dans le code de l'affiche d'origine (la fonction qui génère l'erreur). En regardant le code, je pense qu'il a été copié / collé à partirrandom.shuffle
de l'implémentation de la bibliothèque standard :-)Vous passez le résultat de
somedict.keys()
à la fonction. Dans Python 3,dict.keys
ne renvoie pas de liste, mais un objet de type set qui représente une vue des clés du dictionnaire et (étant de type set) ne prend pas en charge l'indexation.Pour résoudre le problème, utilisez
list(somedict.keys())
pour récupérer les clés et travaillez avec cela.la source
La conversion d'un itérable en liste peut avoir un coût. Au lieu de cela, pour obtenir le premier élément, vous pouvez utiliser:
Ou, si vous souhaitez parcourir tous les éléments, vous pouvez utiliser:
la source
Pourquoi devez-vous implémenter le shuffle alors qu'il existe déjà? Restez sur les épaules des géants.
la source
En Python 2, dict.keys () renvoie une liste, alors qu'en Python 3, il renvoie un générateur.
Vous ne pouvez itérer que sur ses valeurs, sinon vous devrez peut-être le convertir explicitement en liste, c'est-à-dire le passer à une fonction de liste.
la source