有效地找到单词的所有可能的唯一排列[重复]
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了有效地找到单词的所有可能的唯一排列[重复]相关的知识,希望对你有一定的参考价值。
这个问题在这里已有答案:
让我说我有下面这个词:“aabb”然后所有可能独特的排列是:“aabb”,“abab”,“baba”,“abba”,“baab”和“bbaa”。请注意,有4个! = 24种方法,但4选择2 = 6.我目前拥有的是一种天真的方法:找到所有排列,包括重复,然后删除重复:
def permutations(l):
if len(l) <=1:
yield l
else:
for p in permutations(l[1:]):
for i in range(len(l)):
yield p[:i] + l[0] + p[i:]
print(set(permutations("aabb")))
我的问题是,他们是否存在更有效的方法来找到所有这些排列?
编辑:我不希望一种方法遵循找到所有排列的低效想法,然后删除重复。我的代码示例已经这样做了!
编辑:coldspeed正确标记我的问题重复。正确的答案是使用sympy的multiset_permutations函数:
>>> from sympy.utilities.iterables import multiset_permutations
>>> list(multiset_permutations([1,1,1]))
[[1, 1, 1]]
>>> list(multiset_permutations([1,1,2]))
[[1, 1, 2], [1, 2, 1], [2, 1, 1]]
,根据@Bill Bell。
答案
你可以使用permutations
的itertools
。 set
返回独特的元素,然后使用join
将字符串作为单个元素。列表理解方式如下。
from itertools import permutations
result = [''.join(lst) for lst in set((permutations("aabb")))]
print (result)
产量
['aabb', 'baba', 'bbaa', 'abab', 'abba', 'baab']
另一答案
可以使用permutations和set()
删除重复项
from itertools import permutations
res=set()
for i in permutations('aabb'):
res.add(i)
产量
set([('b', 'a', 'b', 'a'), ('b', 'b', 'a', 'a'), ('a', 'b', 'b', 'a'), ('a', 'a', 'b', 'b'), ('b', 'a', 'a', 'b'), ('a', 'b', 'a', 'b')])
如果需要字符串列表的结果
map(''.join,set(permutations('aabb')))
产量
['baba', 'bbaa', 'abba', 'aabb', 'baab', 'abab']
以上是关于有效地找到单词的所有可能的唯一排列[重复]的主要内容,如果未能解决你的问题,请参考以下文章