2016-12-06 10 views
6

Я хотел бы случайным образом перетасовать список, чтобы каждая переменная в списке при перетасовке попадала в новое место в списке.Python: Как случайный перетасовать список, в котором каждая переменная окажется в новом месте

То, что я сейчас делаю:

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

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

С помощью этого метода я перетасовать список, но он по-прежнему можно иметь переменный конец в том же месте, в данном случае «б».

Мой желаемый результат

полностью перемешиваются список

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

Я признателен за любую помощь. Я новичок в python, но, пожалуйста, дайте мне знать, нужна ли какая-либо дополнительная информация.

+3

насколько велик ваш список, как ожидается, быть? грубо говоря. –

+0

@matiaselgart мой список будет включать 15 переменных. – Dre

+4

Просто примечание. Если вы хотите, чтобы каждый элемент находился в по-настоящему случайной позиции, отказ от механизмов, которые не перемещают каждый элемент, фактически уменьшает «случайность». Очень редко вы сталкиваетесь с ситуацией, когда более корректно/безопасно произвольно отклонять любую случайную организацию; не позволяя элементу поддерживать ту же позицию, обнаруживает _more_ информацию, чем позволить им перемещаться полностью случайным образом. – 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