2016-12-06 38 views
6

我想隨機洗牌一個列表,以便列表中的每個變量在洗牌後被放入列表中的新位置。Python:如何隨機洗牌一個列表,其中每個變量將最終在一個新的地方

我目前在做什麼:

list = ['a', 'b','c', 'd']; 
random.shuffle(list) 

list 
['c','b','d','a'] 

用這種方法我從新列表中,但它仍然可能具有可變結束了,在這種情況下,「B」同一個地方。

我的期望輸出

完全打亂列表

['c','a','d','b'] 

我感謝所有幫助。我是python的新手,但請告訴我是否需要更多信息。

+3

你有多大的名單預計?大致說來。 –

+0

@matiaselgart我的列表將包含15個變量。 – Dre

+4

只需注意:如果您想讓每個元素處於一個真正隨機的位置,拒絕不移動每個元素的安排實際上會降低「隨機性」。極其罕見的是,你會遇到一種情況:任意排斥任意給定的隨機排列更爲正確/安全;不允許元素保持相同的位置,而不是讓它們完全隨機地洗牌。 – ShadowRanger

回答

4

像這樣的東西應該做你想要什麼:

import random 
import copy 

def super_shuffle(lst): 
    new_lst = copy.copy(lst) 
    random.shuffle(new_lst) 
    for old, new in zip(lst, new_lst): 
     if old == new: 
      return super_shuffle(lst) 

    return new_lst 

例子:

In [16]: super_shuffle(['a', 'b', 'c']) 
Out[16]: ['b', 'c', 'a'] 
+0

我用['a','b','c','d','e','f']的輸入列表多次運行這段代碼,有時會在元素相同的位置返回一個新列表。 –

+1

這可能是最好的方法。平均而言,大約1/e(大約37%)的排列是紊亂,幾乎與名單大小無關,所以在受到打擊之前,您不必經歷太多的試驗。 –

+0

@John Coleman謝謝。更新。 – Jack

相關問題