【发布时间】: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 !我知道这不是最有效的方法,所以我很快就写了。
标签: python algorithm math permutation itertools