在Python中不重复输出的排列[重复]

Posted

技术标签:

【中文标题】在Python中不重复输出的排列[重复]【英文标题】:Permutations without repeating the output in Python [duplicate] 【发布时间】:2017-06-09 13:29:03 【问题描述】:

我想获得由四个组成的两个不同元素的所有可能排列,而不重复输出但重复元素(显然你需要重复元素以使 4 与只有 2 个元素的组合)。

所以,我尝试了一些事情:

sorted(list(map(lambda x: "".join(x), list(permutations('AB', 4)))))

返回一个空列表。所以我尝试了这个:

sorted(list(map(lambda x: "".join(x), list(permutations('AABB', 4)))))

它接近我期望的输出,但充满了冗余项目,只是其中的几个:

['AABB','AABB','AABB','AABB','ABAB','ABAB','ABAB',...

我期望得到的实际上是:

['AABB','ABAB','ABBA','BAAB','BABA','BBAA']

我也尝试了组合()和产品()而不是排列()但没有成功,但也许我的论点不适合这个问题。

有什么想法吗?

提前非常感谢!

PS。正如 Antoine 所指出的,有一种使用集合而不是列表的解决方法,例如:

sorted(list(map(lambda x: "".join(x), set(permutations('AABB', 4)))))

这给出了预期的输出,但它仍然会生成所有重复,但恰好被过滤掉了,因为集合不能有重复的元素,所以它可能不是最有效的方法。

【问题讨论】:

将其设置为一组将删除重复项。不过,可能有一种更有效的方法! 嗯,@AntoineBoisier-Michaud 的评论似乎快了大约 10 秒。当我发布答案时我没有看到它,并且在我的辩护中,答案需要更长的时间才能输入:-) 为什么 AAAB 不在您的预期结果列表中? 我们在原始集上有两个 As,所以我们不能在输出中包含三个。 哈哈,不用担心,@e4c5 !我知道这不是最有效的方法,所以我很快就写了。 【参考方案1】:

您可以使用set 代替列表并获得所需的结果

sorted(set(map(lambda x: "".join(x), list(permutations('AABB', 4)))))

但请注意,这对于包中的大量元素可能效果不佳。它不会缩放

给了

['AABB', 'ABAB', 'ABBA', 'BAAB', 'BABA', 'BBAA']

也许性能稍微好一点

sorted(map(lambda x: "".join(x), set(permutations('AABB', 4))))

排列等效的python代码在这里列出:https://docs.python.org/2/library/itertools.html#itertools.permutations

原始代码是用 C 语言实现的,因此运行速度会更快。最后,无论您是否遗漏重复项,对大量项目进行排列都无法扩展。

【讨论】:

我已经编辑了我的问题,并在我告诉安托万的时候添加了这个。这可能是一个可以接受的解决方案,但最佳解决方案仍然不需要生成所有这些重复。 即使不使用集合或列表。排列根本无法扩展。可以使用 nPr 计算可能元素的数量,代入一些值会告诉您需要处理的元素数量增长非常快 我使用 scipy.special.binom 来获取排列的数量,但我也需要这个来获得这些实际组合。它用于比较测试用例中函数的输出,因此性能并不重要。不过,我刚刚在几分钟前发布了这个问题,所以如果您不介意,我会等待其他人提供答案后再接受。也许别人有更好的主意。否则我会接受你的。【参考方案2】:

只是复制和粘贴this answer,我看不出它可以如何改进,所以你应该支持它

def permute_unique(myList):
    perms = [[]]
    for i in myList:
        new_perm = []
        for perm in perms:
            for j in range(len(perm) + 1):
                new_perm.append(perm[:j] + [i] + perm[j:])
                # handle duplication
                if j < len(perm) and perm[j] == i: break
        perms = new_perm
    return perms

结果:

>>> sorted(list(map(lambda x: "".join(x), permute_unique('AABB')  )))
['AABB', 'ABAB', 'ABBA', 'BAAB', 'BABA', 'BBAA']

【讨论】:

以上是关于在Python中不重复输出的排列[重复]的主要内容,如果未能解决你的问题,请参考以下文章

P1706 全排列问题

洛谷——P1706 全排列问题

洛谷 P1706 全排列问题

洛谷P1706全排列问题

洛谷 P1706 全排列问题

洛谷——基础搜索