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]
Po uruchomieniu shuffle
funkcji pojawia się następujący błąd, dlaczego tak jest?
TypeError: 'dict_keys' object does not support indexing
python
python-3.x
dictionary
gate_007
źródło
źródło
Odpowiedzi:
Najwyraźniej przechodzisz
d.keys()
do swojejshuffle
funkcji. Prawdopodobnie zostało to napisane za pomocą python2.x (pod.keys()
zwróceniu listy). W python3.xd.keys()
zwracadict_keys
obiekt, który zachowuje się bardziej jak aset
niż alist
. W związku z tym nie może być indeksowany.Rozwiązaniem jest przejście
list(d.keys())
(lub po prostulist(d)
) doshuffle
.źródło
list(d)
który da ci listę kluczy zarówno w python2.x, jak i python3.x bez robienia żadnych kopii :-)dict_keys
Obiekt zachowuje się o wiele więcej jak tylko klucze połowie dict. W szczególności obsługują testowanie członkostwa O (1) (i inne metody podobne do zestawu, które można skutecznie wdrożyć poza tym faktem). Te rzeczy nie są możliwe w przypadku listy, a jeśli chcesz mieć listę kluczy dyktowania, zawsze możesz po prostu to zrobićlist(your_dictionary)
.shuffle
to nazwa funkcji w kodzie oryginalnego nadawcy (funkcja, która zgłasza błąd). Patrząc na kod, myślę, że został skopiowany / wklejony zrandom.shuffle
implementacji w bibliotece standardowej :-)Przekazujesz wynik
somedict.keys()
funkcji. W Pythonie 3dict.keys
nie zwraca listy, ale obiekt podobny do zestawu, który reprezentuje widok kluczy słownika i (będąc podobnym do zestawu) nie obsługuje indeksowania.Aby rozwiązać problem, użyj
list(somedict.keys())
do zbierania kluczy i pracuj z tym.źródło
Konwersja iterowalnej na listę może mieć koszt. Zamiast tego, aby zdobyć pierwszy przedmiot, możesz użyć:
Lub, jeśli chcesz iterować po wszystkich elementach, możesz użyć:
źródło
Dlaczego musisz wdrożyć shuffle, skoro już istnieje? Pozostań na ramionach gigantów.
źródło
W Pythonie 2 dict.keys () zwraca listę, podczas gdy w Pythonie 3 zwraca generator.
Możesz tylko iterować po wartościach, w przeciwnym razie będziesz musiał jawnie przekonwertować je na listę, tj. Przekazać do funkcji listy.
źródło