我有一个类似以下的列表:
lst = [0, 1, 3, 4]
在random.shuffle(lst)
之后,得到的lst
可能类似于[4, 0, 3, 1]
。
接下来的random.shuffle(lst)
是否有办法在每次洗牌后都不需要保存列表的情况下获取之前已经获得的列表?
答案 0 :(得分:0)
以下逻辑在您不希望两个相邻的pemutation相同的情况下起作用:
import itertools
import random
def noRep(prev_idx, perm):
while True:
r = random.randint(0, len(perm) - 1)
if r != prev_idx:
return r
perm_l = list(map(list,itertools.permutations([1, 2, 3])))
idx = random.randint(0, len(perm_l) - 1)
print(perm_l[idx])
idx = noRep(idx, perm_l)
print(perm_l[idx])
idx = noRep(idx, perm_l)
print(perm_l[idx])
输出为:
[1, 2, 3]
[3, 1, 2]
[1, 2, 3]
如您所见,第三个和第一个相同,要每次获得不同的排列,应保存随机选择的索引并避免选择它们。在这种情况下,您还应该更改while True
循环以避免无限循环。
如果您不想生成所有排列,则可以使用choice
并从不断变化的特定值中进行选择。