过滤器在python中生成置换

问题描述 投票:0回答:1

我想在列表中生成元素的排列,但是只保留每个元素在每个位置仅出现一次的集合。

例如[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 ...

python permutation permute
1个回答
0
投票

如果运行时不是那么重要,我会采用惰性方式并生成所有可能的排列(itertools可以为您完成此操作,然后过滤掉所有不符合您要求的排列。

© www.soinside.com 2019 - 2024. All rights reserved.