如何在确保没有连续值相等的情况下随机化列表元素的顺序?

End*_*ndy 8 python sorting random algorithm list

我有一个字符串的python列表,让我们说:

elems = ["A", "B", "C", "D"]
Run Code Online (Sandbox Code Playgroud)

我想创建一个新的列表,其元素是每个elems重复固定次数的元素(比如两次),以随机顺序,但同时确保两个连续元素永远不会具有相同的值.

例如,["D", "B", "A", "B", "D", "C", "A", "C"]是一个好结果.["D", "B", "A", "B", "D", "C", "C", "A"]不是(C在第6和第7位重复).

最简单的想法是probbaly:

ans = 2*elems
random.shuffle(ans)
Run Code Online (Sandbox Code Playgroud)

然后是一些代码来处理重复,但我能想到的所有解决方案都涉及潜在的无限循环.有一种简单可靠的方法吗?

谢谢.

YS-*_*S-L 6

我假设输入列表具有不同的元素.

import random

def randomize_carefully(elems, n_repeat=2):
    s = set(elems)
    res = []
    for n in range(n_repeat):
        if res:
            # Avoid the last placed element
            lst = list(s.difference({res[-1]}))
            # Shuffle
            random.shuffle(lst)
            lst.append(res[-1])
            # Shuffle once more to avoid obvious repeating patterns in the last position
            lst[1:] = random.sample(lst[1:], len(lst)-1)
        else:
            lst = elems[:]
            random.shuffle(lst)
        res.extend(lst)
    return res

for i in range(10):
    print randomize_carefully(["A", "B", "C", "D"])
Run Code Online (Sandbox Code Playgroud)

一些输出:

['B', 'C', 'D', 'A', 'C', 'A', 'D', 'B']
['B', 'D', 'C', 'A', 'C', 'B', 'A', 'D']
['C', 'B', 'D', 'A', 'B', 'C', 'D', 'A']
['B', 'D', 'A', 'C', 'A', 'B', 'D', 'C']
['D', 'C', 'A', 'B', 'C', 'D', 'A', 'B']
['C', 'D', 'A', 'B', 'D', 'C', 'A', 'B']
['D', 'A', 'C', 'B', 'C', 'A', 'B', 'D']
['C', 'D', 'A', 'B', 'C', 'D', 'A', 'B']
['C', 'B', 'A', 'D', 'A', 'B', 'D', 'C']
['B', 'D', 'A', 'C', 'A', 'D', 'C', 'B']
Run Code Online (Sandbox Code Playgroud)