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.
acak.shuffle
harus bekerja. Berikut ini's contoh, di mana objek yang berisi:
from random import shuffle
x = [[i] for i in range(10)]
shuffle(x)
# print(x) gives [[9], [2], [7], [0], [4], [5], [3], [1], [8], [6]]
# of course your results will vary
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 menggunakan len(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.
import random
a = range(5)
b = random.sample(a, len(a))
print a, b, "two list same:", a == b
# print: [0, 1, 2, 3, 4] [2, 1, 3, 4, 0] two list same: False
# The function sample allows no duplicates.
# Result can be smaller but not larger than the input.
a = range(555)
b = random.sample(a, len(a))
print "no duplicates:", a == list(set(b))
try:
random.sample(a, len(a) + 1)
except ValueError as e:
print "Nope!", e
# print: no duplicates: True
# print: Nope! sample larger than population
Butuh beberapa waktu untuk mendapatkan itu juga. Tapi dokumentasi untuk shuffle adalah sangat jelas:
shuffle daftar x di tempat; kembali Tidak ada.
Sehingga anda tidak't cetak(acak.shuffle(b))
. Bukannya melakukan acak.shuffle(b)
dan kemudian print(b)
.
Jika anda kebetulan menggunakan numpy sudah (sangat populer untuk ilmiah dan aplikasi keuangan) anda dapat menghemat impor.
import numpy as np
np.random.shuffle(b)
print(b)
http://docs.scipy.org/doc/numpy/reference/generated/numpy.random.shuffle.html
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:
import random
perm = list(range(len(list_one)))
random.shuffle(perm)
list_one = [list_one[index] for index in perm]
list_two = [list_two[index] for index in perm]
Jika daftar anda adalah array numpy, itu adalah sederhana:
import numpy as np
perm = np.random.permutation(len(list_one))
list_one = list_one[perm]
list_two = list_two[perm]
I've menciptakan utilitas kecil paket mpu
yang memiliki consistent_shuffle
fungsi:
import mpu
# Necessary if you want consistent results
import random
random.seed(8)
# Define example lists
list_one = [1,2,3]
list_two = ['a', 'b', 'c']
# Call the function
list_one, list_two = mpu.consistent_shuffle(list_one, list_two)
Perhatikan bahwa mpu.consistent_shuffle
mengambil jumlah sewenang-wenang argumen. Jadi anda juga dapat mengocok tiga atau lebih dengan daftar itu.
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 generik acak.shuffle
.
Contoh
>>> import numpy as np
>>> import random
Menggunakan acak.shuffle
:
>>> foo = np.array([[1,2,3],[4,5,6],[7,8,9]])
>>> foo
array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])
>>> random.shuffle(foo)
>>> foo
array([[1, 2, 3],
[1, 2, 3],
[4, 5, 6]])
Menggunakan numpy.acak.shuffle
:
>>> foo = np.array([[1,2,3],[4,5,6],[7,8,9]])
>>> foo
array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])
>>> np.random.shuffle(foo)
>>> foo
array([[1, 2, 3],
[7, 8, 9],
[4, 5, 6]])
'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:
# shuffle the list in place
random.shuffle(b)
# print it
print(b)
Jika anda'kembali lagi ke pemrograman fungsional gaya anda mungkin ingin untuk membuat pembungkus berikut fungsi:
def myshuffle(ls):
random.shuffle(ls)
return ls
import random
class a:
foo = "bar"
a1 = a()
a2 = a()
a3 = a()
a4 = a()
b = [a1,a2,a3,a4]
random.shuffle(b)
print(b)
shuffle
di tempat, jadi tidak mencetak hasil, yang adalah Tidak
, tapi daftar.
Anda dapat pergi untuk ini:
>>> A = ['r','a','n','d','o','m']
>>> B = [1,2,3,4,5,6]
>>> import random
>>> random.sample(A+B, len(A+B))
[3, 'r', 4, 'n', 6, 5, 'm', 2, 1, 'a', 'o', 'd']
jika anda ingin kembali ke dua daftar, anda kemudian membagi daftar panjang ini menjadi dua.
""" to shuffle random, set random= True """
def shuffle(x,random=False):
shuffled = []
ma = x
if random == True:
rando = [ma[i] for i in np.random.randint(0,len(ma),len(ma))]
return rando
if random == False:
for i in range(len(ma)):
ave = len(ma)//3
if i < ave:
shuffled.append(ma[i+ave])
else:
shuffled.append(ma[i-ave])
return shuffled
anda bisa membangun sebuah fungsi yang mengambil daftar sebagai parameter dan mengembalikan dikocok versi dari daftar:
from random import *
def listshuffler(inputlist):
for i in range(len(inputlist)):
swap = randint(0,len(inputlist)-1)
temp = inputlist[swap]
inputlist[swap] = inputlist[i]
inputlist[i] = temp
return inputlist
def shuffle(_list):
if not _list == []:
import random
list2 = []
while _list != []:
card = random.choice(_list)
_list.remove(card)
list2.append(card)
while list2 != []:
card1 = list2[0]
list2.remove(card1)
_list.append(card1)
return _list
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.