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.

Mengomentari pertanyaan (8)
Larutan

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.

Komentar (8)

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
Komentar (4)

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).

Komentar (0)

#!/usr/bin/python3

import random

s=list(range(5))
random.shuffle(s) # 
Komentar (0)

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

Komentar (0)
>>> import random
>>> a = ['hi','world','cat','dog']
>>> random.shuffle(a,random.random)
>>> a
['hi', 'cat', 'dog', 'world']

Itu bekerja dengan baik bagi saya. Pastikan untuk mengatur metode random.

Komentar (4)

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]

Numpy / Scipy

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]

mpu

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.

Komentar (0)
from random import random
my_list = range(10)
shuffled_list = sorted(my_list, key=lambda x: random())

Alternatif ini mungkin berguna untuk beberapa aplikasi di mana anda ingin menukar urutan fungsi.

Komentar (2)

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.

numpy.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]])
Komentar (5)

'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
Komentar (2)

Untuk satu-liners, gunakan'random.sampel(list_to_be_shuffled, length_of_the_list)` dengan sebuah contoh:

import random
random.sample(list(range(10)), 10)

output: [2, 9, 7, 8, 3, 0, 4, 1, 6, 5]

Komentar (0)

Seseorang dapat mendefinisikan sebuah fungsi yang disebut dikocok (dalam arti yang sama semacam vs diurutkan)

def shuffled(x):
    import random
    y = x[:]
    random.shuffle(y)
    return y

x = shuffled([1, 2, 3, 4])
print x
Komentar (0)
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.

Komentar (0)

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.

Komentar (0)
""" 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
Komentar (4)

anda bisa menggunakan acak atau sampel . baik yang datang dari random modul.

import random
def shuffle(arr1):
    n=len(arr1)
    b=random.sample(arr1,n)
    return b

ATAU

import random
def shuffle(arr1):
    random.shuffle(arr1)
    return arr1
Komentar (0)

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
Komentar (0)
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
Komentar (5)

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.

Komentar (0)
import random
class a:
    foo = "bar"

a1 = a()
a2 = a()
b = [a1.foo,a2.foo]
random.shuffle(b)
Komentar (0)