2011-10-28 77 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 

希望這是非常有用的。