2011-10-28 43 views
14

是否有一种简单的方法可以在Python中返回一个混洗数组,而不是将其混洗到位?Python中的混洗

例如,而不是

x = [array] 
random.shuffle(x) 

我正在寻找类似

y = shuffle(x) 

它保持X。

注意,我不是在寻找一个函数,而不是像这样:

x=[array] 
y=x 
random.shuffle(x) 
+2

在2009年的一篇关于python-ideas的文章中讨论过,因为你可以写'y = sorted(yourList,key = lambda x:random.random())'而不鼓励。请参阅:http://mail.python.org/pipermail/python-ideas/2009-March/003661.html –

回答

17

sortedkey函数返回一个随机值:

import random 
sorted(l, key=lambda *args: random.random()) 

或者

import os 
sorted(l, key=os.urandom) 
+13

这很简短,但规模为O(n log n),而输入列表的副本随后是'random.shuffle',它是O(n)。参考:http://en.wikipedia。org/wiki/Shuffling#Shuffling_algorithms – EOL

+0

对字符串数组做后者会导致:sorted(a,key = os.urandom)TypeError:'str'对象不能被解释为整数。前者按预期工作。我想知道是否有办法在字符串数组上执行后者? – ntk4

8

只写你自己的。

import random 

def shuffle(x): 
    x = list(x) 
    random.shuffle(x) 
    return x 

x = range(10) 
y = shuffle(x) 
print x # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 
print y # [2, 5, 0, 4, 9, 3, 6, 1, 7, 8] 
+0

谢谢,但我试图节省工作 - 必须将其包含在我编写的所有程序中比仅使用原始配方更加努力。 – Jeff

+1

你想让我神奇地将某些东西添加到Python标准库中吗?为什么你需要在你编写的“所有程序”中洗牌*副本? – FogleBird

+6

我不希望你神奇地做任何事情,我只是问在标准库中是否存在这样一个函数。我本身不需要副本,我想定义一个像x = shuffled([1 2 3 4 5])的数组,而不必通过两行来定义它。 – Jeff

5

没有你正在寻找的功能。只需复制一个列表。

11

使用random来实现您自己的操作将非常简单。我想如下写:

def shuffle(l): 
    l2 = l[:]   #copy l into l2 
    random.shuffle(l2) #shuffle l2 
    return l2   #return shuffled l2 
+2

+1:这是O(n),而'sorted(...,key = os.urandom)'在O(n log n)中。 – EOL

2

你可以使用numpy.random.permutation的任一一个列表或数组,但是如果你已经有一个numpy数组,它是正确的函数。对于混合类型的列表,转换为numpy数组将进行类型转换。

import numpy as np 
my_list = ['foo', 'bar', 'baz', 42] 
print list(np.random.permutation(my_list)) 
# ['bar', 'baz', '42', 'foo'] 
+0

这是这个问题的最佳解决方案! – Ohumeronen

0

以此为演示别处因此认为它可能是值得分享:

import random 

x = shuffleThis(x) 


def shuffleThis(y): 
    random.shuffle(y) 
    return(y) 
#end of Shuffle Function 

希望这是非常有用的。