我希望使用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的所有唯一排列而不获取重复?
答案 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"