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]
Wenn ich die shuffle
Funktion ausführe, wird der folgende Fehler ausgegeben. Warum ist das so?
TypeError: 'dict_keys' object does not support indexing
python
python-3.x
dictionary
gate_007
quelle
quelle
Antworten:
Offensichtlich gehen Sie
d.keys()
zu Ihrershuffle
Funktion über. Wahrscheinlich wurde dies mit python2.x geschrieben (wennd.keys()
eine Liste zurückgegeben wurde). Gibt mit python3.xd.keys()
eindict_keys
Objekt zurück, das sich viel mehr wie aset
als wie a verhältlist
. Daher kann es nicht indiziert werden.Die Lösung besteht darin,
list(d.keys())
(oder einfachlist(d)
) zu übergebenshuffle
.quelle
list(d)
was Ihnen eine Liste von Schlüsseln auf python2.x und python3.x gibt, ohne Kopien zu machen :-)dict_keys
Objekt verhält sich viel mehr wie nur die Schlüssel eines halben Diktats. Insbesondere unterstützen sie O (1) -Mitgliedschaftstests (und andere satzähnliche Methoden, die zusätzlich zu dieser Tatsache effizient implementiert werden können). Diese Dinge sind mit einer Liste nicht möglich, und wenn Sie eine Liste der Schlüssel des Diktats wünschen, konnten Sie dies immer einfach tunlist(your_dictionary)
, um sie zu erhalten.shuffle
ist der Name der Funktion im Code des Originalplakats (die Funktion, die den Fehler auslöst ). Wenn ich mir den Coderandom.shuffle
Sie übergeben das Ergebnis von
somedict.keys()
an die Funktion. Gibt in Python 3dict.keys
keine Liste zurück, aber ein set-ähnliches Objekt, das eine Ansicht der Schlüssel des Wörterbuchs darstellt und (set-like) die Indizierung nicht unterstützt.Um das Problem zu beheben,
list(somedict.keys())
sammeln Sie die Schlüssel und arbeiten Sie damit.quelle
Das Konvertieren eines Iterables in eine Liste kann Kosten verursachen. Um den ersten Artikel zu erhalten, können Sie stattdessen Folgendes verwenden:
Wenn Sie alle Elemente durchlaufen möchten, können Sie Folgendes verwenden:
quelle
Warum müssen Sie Shuffle implementieren, wenn es bereits vorhanden ist? Bleib auf den Schultern der Riesen.
quelle
In Python 2 gibt dict.keys () eine Liste zurück, während in Python 3 ein Generator zurückgegeben wird.
Sie können nur über die Werte iterieren, andernfalls müssen Sie sie möglicherweise explizit in eine Liste konvertieren, dh an eine Listenfunktion übergeben.
quelle