防止来自itertool排列的重复

时间:2017-10-23 17:59:45

标签: python

我希望使用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只是一个独特的结果。

我可以通过将所有这些结果放入一个集合中来解决这个问题来解决这个问题,但我认为我只是使用了排列函数错误。

我如何使用置换函数来获得使用2 A和2 B的所有唯一排列而不获取重复?

4 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:0)

您可以迭代set或使用hashing

from itertools import permutations, combinations

perm = set(permutations('AABB', 4))
for i in perm:
    print(i)
#Output
('A', 'A', 'B', 'B')
('A', 'B', 'A', 'B')
('A', 'B', 'B', 'A')
('B', 'A', 'A', 'B')
('B', 'B', 'A', 'A')
('B', 'A', 'B', 'A')  

使用字典:

from itertools import permutations, combinations
dicta = {}
perm = permutations('AABB', 4)
for i in list(perm):
    if i in dicta:
        dicta[i] += 1
    else:
        dicta[i] = 1
print([i for i in dicta.keys()])

答案 2 :(得分:0)

您非常正确,itertools会将 positions 上的元素视为 values 上的元素 - 因此,它确实不提供支持删除这些类型的重复...

我们从the documentation了解到这一点:

  

元素根据其位置而不是其价值被视为唯一。因此,如果输入元素是唯一的,则每个排列中都不会有重复值。

这给我们留下了两个选项,要么自己编写function,要么转换为set而不是list

from itertools import permutations

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

outputs

('A', 'B', 'B', 'A')
('B', 'A', 'B', 'A')
('B', 'B', 'A', 'A')
('A', 'B', 'A', 'B')
('A', 'A', 'B', 'B')
('B', 'A', 'A', 'B')

请注意,您无需将set转换回list,因为iterate可以set

答案 3 :(得分:0)

以上输出没有错。首先要了解排列是如何工作的。

s = "AA"

对于上面的字符串,排列将给出2个字符串。

AA and AA

以上两个字符串完全有效,因为

1st      2nd
 A        A      --->this is first output.

2nd      1st
 A        A    ----> this is 2nd one.

排列的作用就是替换字符的位置。不幸的是,它没有检查任何重复。要删除重复项,可以使用集,因为集不允许任何重复值。

myList = ["AA", "AB", "AA"]
set(myList)
output---> "AA", "AB"