在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中不重复输出的排列[重复]的主要内容,如果未能解决你的问题,请参考以下文章