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]
Ketika saya menjalankan shuffle
fungsi itu menimbulkan kesalahan berikut, mengapa begitu?
TypeError: 'dict_keys' object does not support indexing
python
python-3.x
dictionary
gate_007
sumber
sumber
Jawaban:
Jelas Anda melewati fungsi
d.keys()
Andashuffle
. Mungkin ini ditulis dengan python2.x (ketikad.keys()
mengembalikan daftar). Dengan python3.x,d.keys()
mengembalikandict_keys
objek yang berperilaku lebih sepertiset
alist
. Karena itu, tidak dapat diindeks.Solusinya adalah lulus
list(d.keys())
(atau hanyalist(d)
) keshuffle
.sumber
list(d)
yang akan memberi Anda daftar kunci pada python2.x dan python3.x tanpa membuat salinan :-)dict_keys
objek berperilaku lebih banyak seperti hanya tombol setengah dari dict. Secara khusus, mereka mendukung O (1) pengujian keanggotaan (dan metode set-seperti lainnya yang dapat diimplementasikan secara efisien di atas fakta itu). Hal-hal ini tidak mungkin dilakukan dengan daftar dan jika Anda menginginkan daftar kunci dikt, Anda selalu dapat melakukannyalist(your_dictionary)
untuk mendapatkannya.shuffle
adalah nama fungsi dalam kode poster asli (fungsi yang melempar kesalahan). Melihat kode tersebut, saya pikir kode itu disalin / ditempelkan darirandom.shuffle
implementasi di perpustakaan standar :-)Anda melewatkan hasil
somedict.keys()
ke fungsi. Dalam Python 3,dict.keys
tidak mengembalikan daftar, tetapi objek set-seperti yang mewakili tampilan kunci kamus dan (sedang set-seperti) tidak mendukung pengindeksan.Untuk memperbaiki masalah, gunakan
list(somedict.keys())
untuk mengumpulkan kunci, dan bekerja dengan itu.sumber
Mengubah iterable ke daftar mungkin memiliki biaya. Sebagai gantinya, untuk mendapatkan item pertama, Anda dapat menggunakan:
Atau, jika Anda ingin mengulang semua item, Anda dapat menggunakan:
sumber
Mengapa Anda perlu menerapkan shuffle ketika sudah ada? Tetap di pundak raksasa.
sumber
Dalam Python 2 dict.keys () mengembalikan daftar, sedangkan di Python 3 mengembalikan generator.
Anda hanya bisa mengulangi nilai-nilai itu lain jika Anda mungkin harus secara eksplisit mengubahnya menjadi daftar yaitu meneruskannya ke fungsi daftar.
sumber