2016-12-06 54 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

相关问题