如何使用约束(与每个元素的索引相关)对列表进行洗牌
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]
例如,有一个列表,[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]