2013-07-05 40 views
1

我正在寫,這將創建一個新的洗牌列表中的功能(我不能使用內置的隨機播放功能)Python的洗牌從頭

def Shuf(aList): 

    import random 
    newList=[] 
    for i in range(len(aList)): 
     element=random.sample(aList,1) 
     newList+=element 
    return newList 

這是我現在所擁有的,它的工作但是當我返回混洗列表時,我的列表中有重複的元素。如何讓我的函數只返回列表中的元素一次?

+1

採樣有多次選擇相同物品的風險 - 正如您發現的那樣。而不是採樣,你可以考慮**交換**作爲一種策略。 – FMc

+0

洗牌沒有洗牌,聽起來很像功課... – Guillaume

+4

@Guillaume +1可疑作業。不過,我們可以給你一些指導。首先,如果可以避免,__do不會在函數內導入模塊___。其次,__try探索Python提供的關鍵內置數據結構___,您可能會對以下問題感到驚訝:1.這個問題可以很容易地解決2.這個問題可以通過多少方式解決。 – woozyking

回答

0

就像下一個(未測試)。

from random import choice 

def get_list(l): 
    len_ = len(l) 
    output = [] 

    for i in range(len_): 
     index = choice(len(l)) 
     output.append(l[ index ]) 
     del l[ index ] 

    return output 
0

您可能會發現這種用於混洗的實現方式適合您的需求。確保在使用它們之前注意兩個函數之間的區別。

>>> import random 
>>> def shuffle(array): 
    copy = list(array) 
    shuffle_in_place(copy) 
    return copy 

>>> def shuffle_in_place(array): 
    array_len = len(array) 
    assert array_len > 2, 'Array is too short to shuffle!' 
    for index in range(array_len): 
     swap = random.randrange(array_len - 1) 
     swap += swap >= index 
     array[index], array[swap] = array[swap], array[index] 


>>> array = list(range(10)) 
>>> array 
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 
>>> shuffle(array) 
[7, 2, 3, 5, 8, 6, 0, 1, 9, 4] 
>>> array 
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 
>>> shuffle_in_place(array) 
>>> array 
[8, 3, 1, 6, 9, 7, 0, 4, 2, 5] 
>>>