Saya memiliki daftar objek dan saya ingin mengocoknya. Saya pikir saya bisa menggunakan random.shuffle
metode ini, tetapi ini tampaknya gagal ketika daftar objek. Apakah ada metode untuk mengocok objek atau cara lain untuk mengatasi ini?
import random
class A:
foo = "bar"
a1 = a()
a2 = a()
b = [a1, a2]
print(random.shuffle(b))
Ini akan gagal.
Jawaban:
random.shuffle
harus bekerja. Berikut ini contoh, di mana objek adalah daftar:Perhatikan bahwa shuffle berfungsi di tempatnya , dan mengembalikan None.
sumber
random
dokumentasi modul .random.sample(x, len(x))
atau hanya menyalinnyashuffle
saja. Untuklist.sort
yang memiliki masalah serupa, ada sekaranglist.sorted
, tetapi tidak ada varian serupa untukshuffle
.from random import SystemRandom
sebagai gantinya; tambahcryptorand = SystemRandom()
dan ubah baris 3 menjadicryptorand.shuffle(x)
Ketika Anda mengetahui pengocokan di tempat adalah masalahnya. Saya juga sering mengalami masalah, dan sepertinya sering lupa cara menyalin daftar juga. Menggunakan
sample(a, len(a))
adalah solusinya, menggunakanlen(a)
sebagai ukuran sampel. Lihat https://docs.python.org/3.6/library/random.html#random.sample untuk dokumentasi Python.Berikut ini adalah versi sederhana penggunaan
random.sample()
yang mengembalikan hasil yang diacak sebagai daftar baru.sumber
old = [1,2,3,4,5]; new = list(old); random.shuffle(new); print(old); print(new)
(ganti; dengan baris baru)old[:]
juga bisa melakukan salinan dangkal untuk daftarold
.sample()
sangat membantu untuk membuat prototipe analisis data.sample(data, 2)
untuk mengatur kode lem pipa, kemudian "melebarkannya" secara bertahap, hinggalen(data)
.Butuh beberapa waktu untuk mendapatkannya juga. Tetapi dokumentasi untuk shuffle sangat jelas:
Jadi kamu tidak seharusnya
print(random.shuffle(b))
. Sebaliknya lakukanrandom.shuffle(b)
dan kemudianprint(b)
.sumber
sumber
Jika Anda sudah menggunakan numpy (sangat populer untuk aplikasi ilmiah dan finansial), Anda dapat menyimpan sendiri impor.
http://docs.scipy.org/doc/numpy/reference/generated/numpy.random.shuffle.html
sumber
Ini bekerja dengan baik untuk saya. Pastikan untuk mengatur metode acak.
sumber
Jika Anda memiliki beberapa daftar, Anda mungkin ingin menentukan permutasi (cara Anda mengacak daftar / mengatur ulang item dalam daftar) terlebih dahulu dan kemudian menerapkannya ke semua daftar:
Numpy / Scipy
Jika daftar Anda adalah array numpy, itu lebih sederhana:
mpu
Saya telah membuat paket utilitas kecil
mpu
yang memilikiconsistent_shuffle
fungsi:Catatan yang
mpu.consistent_shuffle
mengambil sejumlah argumen sewenang-wenang. Jadi, Anda juga dapat mengacak tiga daftar atau lebih dengannya.sumber
Alternatif ini mungkin berguna untuk beberapa aplikasi di mana Anda ingin menukar fungsi pemesanan.
sumber
sorted
, ini adalah pengocokan fungsional (jika Anda menyukai hal semacam itu).Dalam beberapa kasus saat menggunakan array numpy, menggunakan
random.shuffle
data duplikat yang dibuat dalam array.Alternatifnya adalah menggunakan
numpy.random.shuffle
. Jika Anda sudah menggunakan numpy, ini adalah metode yang lebih disukai daripada generikrandom.shuffle
.numpy.random.shuffle
Contoh
Menggunakan
random.shuffle
:Menggunakan
numpy.random.shuffle
:sumber
numpy.random.permutation
mungkin menarik: stackoverflow.com/questions/15474159/shuffle-vs-permute-numpyrandom.shuffle
dokumentasi harus berteriak Jangan gunakan dengan array numpyUntuk one-liners, gunakan
random.sample(list_to_be_shuffled, length_of_the_list)
dengan contoh:output: [2, 9, 7, 8, 3, 0, 4, 1, 6, 5]
sumber
'print func (foo)' akan mencetak nilai balik dari 'func' ketika dipanggil dengan 'foo'. 'shuffle' tetapi tidak memiliki None sebagai jenis pengembaliannya, karena daftar akan dimodifikasi di tempat, maka tidak mencetak apa pun. Penanganan masalah:
Jika Anda lebih menyukai gaya pemrograman fungsional, Anda mungkin ingin membuat fungsi wrapper berikut:
sumber
random.sample(ls, len(ls))
jika Anda benar-benar ingin turun rute itu.Seseorang dapat mendefinisikan fungsi yang disebut
shuffled
(dalam arti yang samasort
vssorted
)sumber
shuffle
sudah ada, jadi jangan cetak hasil, yang adaNone
, tetapi daftar.sumber
Anda bisa melakukannya untuk ini:
jika Anda ingin kembali ke dua daftar, Anda kemudian membagi daftar panjang ini menjadi dua.
sumber
Anda bisa membangun fungsi yang menggunakan daftar sebagai parameter dan mengembalikan versi daftar yang diacak:
sumber
sumber
Anda bisa menggunakan shuffle atau sampel. keduanya berasal dari modul acak.
ATAU
sumber
Pastikan Anda tidak menamai file sumber Anda random.py, dan bahwa tidak ada file di direktori kerja Anda yang disebut random.pyc .. dapat menyebabkan program Anda mencoba dan mengimpor file random.py lokal Anda alih-alih modul ular sanca. .
sumber
sumber
_list.extend(list2)
, yang lebih ringkas DAN lebih efisien.sumber
Proses pengocokan adalah "dengan penggantian" , sehingga terjadinya setiap item dapat berubah! Setidaknya ketika ketika item dalam daftar Anda juga daftar.
Misalnya,
Setelah,
Jumlah [0] mungkin 9 atau 8, tetapi tidak tepat 10.
sumber
Paket: Tulis shuffle tanpa bergantung pada perpustakaan untuk melakukan pengangkatan berat. Contoh: Buka daftar dari awal mulai dengan elemen 0; cari posisi acak baru untuk itu, katakan 6, masukkan nilai 0 di nilai 6 dan 6 di 0. Pindah ke elemen 1 dan ulangi proses ini, dan seterusnya melalui sisa daftar
sumber
my_list[i], my_list[j] = my_list[j], my_list[i]
Ini bekerja dengan baik. Saya mencoba di sini dengan fungsi sebagai objek daftar:
Mencetak: foo1 foo2 foo3 foo2 foo3 foo1 (foo di baris terakhir memiliki urutan acak)
sumber