我想在列表中生成元素的排列,但只保留一个集合,其中每个元素只在每个位置上一次。
例如[1, 2, 3, 4, 5, 6]
可能是一个用户列表,我想要 3 个排列。一个好的设置是:
[1,2,3,5,4,6]
[2,1,4,6,5,3]
[3,4,5,1,6,2]
但是,不能将例如 [1,3,2,6,5,4] 添加到上面,因为有两个排列,其中 1 位于第一个位置两次,5 也将位于第 5 个位置两次,但是其他元素只出现在这些位置上一次。
到目前为止,我的代码是:
# this simply generates a number of permutations specified by number_of_samples
def generate_perms(player_list, number_of_samples):
myset = set()
while len(myset) < number_of_samples:
random.shuffle(player_list)
myset.add(tuple(player_list))
return [list(x) for x in myset]
# And this is my function that takes the stratified samples for permutations.
def generate_stratified_perms(player_list, number_of_samples):
user_idx_dict = {}
i = 0
while(i < number_of_samples):
perm = generate_perms(player_list, 1)
for elem in perm:
if not user_idx_dict[elem]:
user_idx_dict[elem] = [perm.index(elem)]
else:
user_idx_dict[elem] += [perm.index(elem)]
[...]
return total_perms
但我不知道如何完成第二个功能。
所以简而言之,我想给我的函数一些要生成的排列,并且该函数应该给我那个排列数量,其中没有一个元素比其他元素出现在同一个位置上(一次,如果所有元素都出现一次,两次,如果都出现两次,等等)。