用Python洗牌

用Python洗牌,python,random,shuffle,Python,Random,Shuffle,在Python中,有没有一种直接的方法来返回一个经过洗牌的数组,而不是就地洗牌 e、 而不是 x = [array] random.shuffle(x) 我在找像这样的东西 y = shuffle(x) 它保持x 注意,我不是在寻找一个函数,不是类似于: x=[array] y=x random.shuffle(x) 写你自己的 import random def shuffle(x): x = list(x) random.shuffle(x) return x

在Python中,有没有一种直接的方法来返回一个经过洗牌的数组,而不是就地洗牌

e、 而不是

x = [array]
random.shuffle(x)
我在找像这样的东西

y = shuffle(x)
它保持x

注意,我不是在寻找一个函数,不是类似于:

x=[array]
y=x
random.shuffle(x)
写你自己的

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]

没有你想要的功能。只需复制一个列表。

使用
random
实现自己的列表将非常简单。我将写如下:

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

排序
,带有返回随机值的
函数:

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


可以对列表或数组使用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']

将此用作其他地方的演示,因此认为它可能值得分享:

import random

x = shuffleThis(x)


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

希望这是有用的。

谢谢,但我正在努力节省精力——在我编写的所有程序中包含这一点比使用原始公式更费劲。你想让我神奇地向Python标准库添加一些内容吗?为什么在你编写的“所有程序”中都需要无序拷贝呢?我不想让你神奇地做任何事情,我只是问在标准库中是否存在这样的函数。我不需要副本本身,我想定义一个像x=shuffled([1 2 3 4 5])这样的数组,而不是必须在两行上定义它。@Jeff,创建自己的库以便在程序中使用没有错。如果(出于某种原因)您正在编写单文件程序,那么您可以在创建新程序时将文本复制到中,或者将其转换为您最喜爱的文本编辑器中的片段。。。所以+1@avasopht这绝对没什么问题,只是这不是我在2009年一篇关于python思想的帖子中讨论的内容,因为你可以编写
y=sorted(yourList,key=lambda x:random.random())
。请参见:+1:这是O(n),而排序(…,key=os.uradom)是O(n log n)。这很短,但按O(n log n)缩放,而输入列表的副本后跟
random.shuffle
是O(n)。引用:对字符串数组执行后一种操作会导致:sorted(a,key=os.uradom)TypeError:“str”对象不能解释为整数。按预期做前者是有效的。我想知道是否有办法在字符串数组中做后者呢?我希望“排序”的项目会有一个偏差,以保持接近其在列表中的原始位置,而使用
random。根据原始列表的顺序,shuffle
应该没有偏差。这是解决此问题的最佳方法!
import random

x = shuffleThis(x)


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