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)