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即可