我想使用 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
以字典顺序返回(如果原始字符串按排序顺序)。