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

Python 如何使用约束(与每个元素的索引相关)洗牌列表,python,python-3.x,list,shuffle,Python,Python 3.x,List,Shuffle,例如,有一个列表,[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))

例如,有一个列表,
[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]
是有效的输出,但不是旋转

使其易于旋转,并且对旋转进行了优化

可用于随机化旋转计数

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]

仅对于非常短的列表,一种快速实现的方法是拒绝采样。继续改组,直到你得到一份有效的名单。随着列表越来越长,满足条件的可能性越来越小。对于像
[1]
[1,1]
这样的单数元素,您的预期输出是什么
ValueError
?@wjandrea-oh我假设列表有多个元素并且没有冗余。感谢您的提醒。另外,
i
未使用,因此调用
range()
len()
没有意义,只需在lst中执行
for即可