我想使用 2 A 和 2 B 获得 4 个字符串的所有唯一排列

from itertools import permutations

perm = permutations('AABB', 4)
for i in list(perm):
    print(i)
这让我
('A', 'A', 'B', 'B')
('A', 'A', 'B', 'B')
('A', 'B', 'A', 'B')
('A', 'B', 'B', 'A')
...
如您所见,我得到了重复项。我想这是因为它把第一名和第二名的 A 视为不同的值,但对我来说 AABB 只是 1 个独特的结果。
我可以通过将它们全部放入一个集合中以消除重复来解决这个结果,但我认为我只是使用了错误的排列函数。
如何使用置换函数通过使用 2 个 A 和 2 个 B 获得所有唯一的置换而不会得到重复?

最佳答案

在 itertools 中没有直接的方法可以做到这一点。 permutations() 的文档说明:



这意味着尽管两个 A 看起来与您相同,但 itertools 将它们视为不相等,因为它们在原始字符串中的位置不同。

您想要的结果数称为 4 个值的多项式系数,其中 2 个相等,另外 2 个相等。您可以通过将自己的等效函数编码为 permutations 来获得所需的内容,但这需要一段时间来编码和调试。 (也许将其称为 multinomial,尽管该词指的是数字,而不是实际列表。)一种更简单的方法,可能在执行和内存使用方面较慢,但在编程中要快得多,是使用 permutations 和 Python 的 set 来删除重复项。你可以这样做:

from itertools import permutations

perm = permutations('AABB', 4)
for i in set(perm):
    print(i)

这可能会导致打印输出的顺序不同。如果要恢复原始顺序,请使用 sorted(set(perm)) ,因为 permutations 以字典顺序返回(如果原始字符串按排序顺序)。

10-06 08:43