我有一个对象列表,我想对其进行洗牌。我以为可以使用该random.shuffle
方法,但是当列表中包含对象时,这似乎失败了。是否有一种用于改组对象的方法或解决此问题的另一种方法?
import random
class A:
foo = "bar"
a1 = a()
a2 = a()
b = [a1, a2]
print(random.shuffle(b))
这将失败。
我有一个对象列表,我想对其进行洗牌。我以为可以使用该random.shuffle
方法,但是当列表中包含对象时,这似乎失败了。是否有一种用于改组对象的方法或解决此问题的另一种方法?
import random
class A:
foo = "bar"
a1 = a()
a2 = a()
b = [a1, a2]
print(random.shuffle(b))
这将失败。
Answers:
random.shuffle
应该管用。这是一个示例,其中对象是列表:
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
请注意,随机播放在适当的地方起作用,并返回None。
random
模块的文档中详细列出。
random.sample(x, len(x))
或仅复制一份shuffle
。对于list.sort
类似的问题,现在有list.sorted
,但是没有类似的变体shuffle
。
from random import SystemRandom
改用;添加cryptorand = SystemRandom()
第3行并将其更改为cryptorand.shuffle(x)
当您了解到就地改组就是问题所在。我也经常遇到问题,而且似乎也常常忘记如何复制列表。使用sample(a, len(a))
是解决方案,使用len(a)
作为样本量。有关Python文档,请参见https://docs.python.org/3.6/library/random.html#random.sample。
这是使用的简单版本random.sample()
,它将经过改组的结果作为新列表返回。
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
old = [1,2,3,4,5]; new = list(old); random.shuffle(new); print(old); print(new)
替换;换行)
old[:]
也可以进行浅表复制old
。
sample()
对于数据分析的原型特别有用。sample(data, 2)
用于设置管道的粘合代码,然后逐步对其进行“扩展”,直至len(data)
。
如果您碰巧已经使用numpy(在科学和金融应用中非常流行),则可以节省导入时间。
import numpy as np
np.random.shuffle(b)
print(b)
http://docs.scipy.org/doc/numpy/reference/generation/numpy.random.shuffle.html
>>> import random
>>> a = ['hi','world','cat','dog']
>>> random.shuffle(a,random.random)
>>> a
['hi', 'cat', 'dog', 'world']
这对我来说可以。确保设置随机方法。
如果您有多个列表,则可能要先定义排列(随机排列列表/重新排列列表中项目的方式),然后将其应用于所有列表:
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数组,则更为简单:
import numpy as np
perm = np.random.permutation(len(list_one))
list_one = list_one[perm]
list_two = list_two[perm]
我创建了mpu
具有以下consistent_shuffle
功能的小型实用程序包:
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)
请注意,它mpu.consistent_shuffle
接受任意数量的参数。因此,您也可以使用它洗牌三个或更多列表。
from random import random
my_list = range(10)
shuffled_list = sorted(my_list, key=lambda x: random())
对于要交换订购功能的某些应用程序,此替代方法可能很有用。
sorted
,这是功能上的改组(如果您喜欢这种事情)。
在某些情况下,使用numpy数组时,请random.shuffle
在数组中使用创建的重复数据。
另一种方法是使用numpy.random.shuffle
。如果您已经在使用numpy,那么这是优于generic的首选方法random.shuffle
。
例
>>> import numpy as np
>>> import random
使用random.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]])
使用numpy.random.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]])
numpy.random.permutation
可能感兴趣:stackoverflow.com/questions/15474159/shuffle-vs-permute-numpy
random.shuffle
文档应该
当使用'foo'调用时,'print func(foo)'将输出'func'的返回值。但是,'shuffle'的返回类型为None,因为该列表将被修改,因此不打印任何内容。解决方法:
# shuffle the list in place
random.shuffle(b)
# print it
print(b)
如果您更喜欢函数式编程风格,则可能需要创建以下包装函数:
def myshuffle(ls):
random.shuffle(ls)
return ls
random.sample(ls, len(ls))
如果您真的想沿着那条路线走。
""" 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
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
_list.extend(list2)
,它更简洁,更高效。
计划:无需依赖库就可以完成改组工作。示例:从元素0的开头开始浏览列表;找到一个新的随机位置,例如6,将0的值放在6中,将6的值放在0中。移到元素1并重复此过程,以此类推。
import random
iteration = random.randint(2, 100)
temp_var = 0
while iteration > 0:
for i in range(1, len(my_list)): # have to use range with len()
for j in range(1, len(my_list) - i):
# Using temp_var as my place holder so I don't lose values
temp_var = my_list[i]
my_list[i] = my_list[j]
my_list[j] = temp_var
iteration -= 1
my_list[i], my_list[j] = my_list[j], my_list[i]
它工作正常。我在这里尝试使用功能作为列表对象:
from random import shuffle
def foo1():
print "foo1",
def foo2():
print "foo2",
def foo3():
print "foo3",
A=[foo1,foo2,foo3]
for x in A:
x()
print "\r"
shuffle(A)
for y in A:
y()
它打印出来:foo1 foo2 foo3 foo2 foo3 foo1(最后一行中的foos具有随机顺序)