我想在列表中生成元素的排列,但是只保留每个元素在每个位置仅出现一次的集合。
例如[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在第一个位置两次位于第五位,但是其他元素仅在这些位置上出现一次。
到目前为止,我的代码是:
# 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
但是我不知道如何完成第二个功能。
简而言之,我想给我的函数一个生成的置换,函数应该给我一定数量的置换,其中没有一个元素比其他元素出现在同一位置的次数更多(一次,如果所有元素都出现在该位置)一次,两次,如果全部都出现两次,等等。
我想在列表中生成元素的排列,但是只保留一个集合,其中每个元素在每个位置仅出现一次。例如[1、2、3、4、5、6]可能是用户列表,我想3 ...
如果运行时不是那么重要,我会采用惰性方式并生成所有可能的排列(itertools
可以为您完成此操作,然后过滤掉所有不符合您要求的排列。