Menyeret daftar objek
Saya memiliki daftar objek dan aku ingin shuffle mereka. Saya pikir saya bisa menggunakan acak.shuffle
metode, tetapi ini tampaknya gagal saat daftar adalah benda-benda. Apakah ada metode untuk menyeret benda-benda atau yang lain, cara sekitar ini?
import random
class A:
foo = "bar"
a1 = a()
a2 = a()
b = [a1, a2]
print(random.shuffle(b))
Ini akan gagal.
716
23
acak.shuffle
harus bekerja. Berikut ini's contoh, di mana objek yang berisi:Perhatikan bahwa shuffle bekerja di tempat, dan kembali Tidak ada.
Seperti yang telah anda pelajari di tempat menyeret masalah. Saya juga punya masalah yang sering, dan sering tampaknya lupa bagaimana untuk menyalin daftar, juga. Menggunakan
sampel(a, len(a))
adalah solusinya, dengan menggunakanlen(a)
sebagai ukuran sampel. Lihat https://docs.python.org/3.6/library/random.html#random.sample untuk dokumentasi Python.Berikut ini's versi sederhana menggunakan
acak.sampel()
yang mengembalikan dikocok hasilnya sebagai daftar baru.Butuh beberapa waktu untuk mendapatkan itu juga. Tapi dokumentasi untuk shuffle adalah sangat jelas:
Sehingga anda tidak't
cetak(acak.shuffle(b))
. Bukannya melakukanacak.shuffle(b)
dan kemudianprint(b)
.Jika anda kebetulan menggunakan numpy sudah (sangat populer untuk ilmiah dan aplikasi keuangan) anda dapat menghemat impor.
http://docs.scipy.org/doc/numpy/reference/generated/numpy.random.shuffle.html
Itu bekerja dengan baik bagi saya. Pastikan untuk mengatur metode random.
Jika anda memiliki beberapa daftar, anda mungkin ingin untuk mendefinisikan permutasi (cara anda shuffle daftar / mengatur ulang item dalam daftar) terlebih dahulu dan kemudian menerapkannya ke semua daftar:
Numpy / Scipy
Jika daftar anda adalah array numpy, itu adalah sederhana:
mpu
I've menciptakan utilitas kecil paket
mpu
yang memilikiconsistent_shuffle
fungsi:Perhatikan bahwa
mpu.consistent_shuffle
mengambil jumlah sewenang-wenang argumen. Jadi anda juga dapat mengocok tiga atau lebih dengan daftar itu.Alternatif ini mungkin berguna untuk beberapa aplikasi di mana anda ingin menukar urutan fungsi.
Dalam beberapa kasus ketika menggunakan numpy array, menggunakan
acak.shuffle
dibuat duplikat data dalam array.Alternatif lain adalah dengan menggunakan
numpy.acak.shuffle
. Jika anda're bekerja dengan numpy sudah, ini adalah metode yang disukai lebih dari generikacak.shuffle
.numpy.acak.shuffle
Contoh
Menggunakan
acak.shuffle
:Menggunakan
numpy.acak.shuffle
:'cetak func(foo)' akan mencetak kembali nilai 'func' ketika disebut dengan 'foo'. 'shuffle' namun Tidak seperti jenis kembali, seperti yang daftar akan dimodifikasi di tempat, maka ia akan mencetak apa-apa. Solusi:
Jika anda'kembali lagi ke pemrograman fungsional gaya anda mungkin ingin untuk membuat pembungkus berikut fungsi:
Untuk satu-liners, gunakan'random.sampel(list_to_be_shuffled, length_of_the_list)` dengan sebuah contoh:
output: [2, 9, 7, 8, 3, 0, 4, 1, 6, 5]
Seseorang dapat mendefinisikan sebuah fungsi yang disebut
dikocok
(dalam arti yang samasemacam
vsdiurutkan
)shuffle
di tempat, jadi tidak mencetak hasil, yang adalahTidak
, tapi daftar.Anda dapat pergi untuk ini:
jika anda ingin kembali ke dua daftar, anda kemudian membagi daftar panjang ini menjadi dua.
anda bisa menggunakan acak atau sampel . baik yang datang dari random modul.
ATAU
anda bisa membangun sebuah fungsi yang mengambil daftar sebagai parameter dan mengembalikan dikocok versi dari daftar:
Pastikan anda tidak penamaan file sumber anda random.py, dan bahwa tidak ada file dalam direktori kerja anda disebut random.pyc.. baik bisa menyebabkan program anda untuk mencoba dan impor lokal random.py file bukan ular acak modul.