如何使用约束(与每个元素的索引相关)对列表进行洗牌

How can I shuffle the list with constraints(related to the index of each elements)

例如,有一个列表,[1,2,3] 具有约束,使得打乱列表的每个元素不应与前一个元素的位置重叠。 为了解释清楚,假设之前的列表是[1,2,3],但在打乱后变成了[1,3,2]。对于这种情况,由于 1 是两个列表的第一个元素,因此不满足约束条件。满足该约束的输出将是 [2,3,1][3,1,2].

有没有办法在重新排列列表之前进行此约束?

提前致谢。

根据您的规范,您要求的只是列表的所有可能轮换。例如:

def rotations(lst):
    for i in range(len(lst)):
        print(lst)
        lst.append(lst.pop(0))

您可以通过旋转列表来完成此操作。例如,[1, 2, 3]的旋转是[3, 1, 2][2, 3, 1]

请注意,对于长度 > 3 的情况,旋转将是符合您的约束的所有可能洗牌的子集,但如果我理解正确,那对您有用。例如,对于输入 [1, 2, 3, 4][4, 3, 2, 1] 是有效输出,但不是旋转。

collections.deque 使其易于旋转,而且针对旋转进行了优化。

random.randrange()可用于随机旋转计数。

import random
import collections

def random_rotation(lst):
    """
    Rotate a list by a random amount.

    Similar to "random.shuffle()", but ensures that all elements will move.
    """
    n = random.randrange(1, len(lst))
    d = collections.deque(lst)
    d.rotate(n)
    lst[:] = d  # Overwrite

L = [1, 2, 3, 4]
random_rotation(L)
print(L)

示例输出:

[2, 3, 4, 1]