TypeError: ‘dict_keys’ object ondersteunt geen indexering

Als ik de functie shuffle uitvoer, krijg ik de volgende foutmelding, hoe komt dat?

TypeError: 'dict_keys' object does not support indexing

Antwoord 1, autoriteit 100%

Het is duidelijk dat je d.keys() doorgeeft aan je shuffle-functie. Waarschijnlijk is dit geschreven met python2.x (toen d.keys() een lijst teruggaf). Met python3.x retourneert d.keys() een dict_keys object dat zich veel meer gedraagt ​​als een set dan een list. Als zodanig kan het niet worden geïndexeerd.

De oplossing is om list(d.keys()) (of gewoon list(d)) door te geven aan shuffle.


Antwoord 2, autoriteit 5%

Je geeft het resultaat van somedict.keys() door aan de functie. In Python 3 retourneert dict.keys geen lijst, maar een set-achtig object dat een weergave van de woordenboeksleutels vertegenwoordigt en (als set-achtig) geen indexering ondersteunt.

Om het probleem op te lossen, gebruikt u list(somedict.keys()) om de sleutels te verzamelen en daarmee te werken.


Antwoord 3, autoriteit 4%

Een iterabele naar een lijst converteren kan kosten met zich meebrengen. In plaats daarvan, om het eerste item te krijgen, kun je gebruiken:

next(iter(keys))

Of, als u alle items wilt herhalen, kunt u het volgende gebruiken:

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

Antwoord 4

In Python 2 retourneert dict.keys() een lijst, terwijl het in Python 3 een generator retourneert.

Je kunt alleen de waarden herhalen, anders moet je het misschien expliciet naar een lijst converteren, d.w.z. doorgeven aan een lijstfunctie.


Antwoord 5

Waarom moet u shuffle implementeren als het al bestaat? Blijf op de schouders van reuzen.

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)

LEAVE A REPLY

Please enter your comment!
Please enter your name here

Other episodes