有效地找到单词的所有可能的唯一排列[重复]

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。

答案

你可以使用permutationsitertoolsset返回独特的元素,然后使用join将字符串作为单个元素。列表理解方式如下。

from itertools import permutations
result = [''.join(lst) for lst in set((permutations("aabb")))]
print (result)

产量

['aabb', 'baba', 'bbaa', 'abab', 'abba', 'baab']
另一答案

可以使用permutationsset()删除重复项

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']

以上是关于有效地找到单词的所有可能的唯一排列[重复]的主要内容,如果未能解决你的问题,请参考以下文章

在PHP中查找数组元素的所有可能的唯一组合[重复]

c_cpp 给定可能包含重复项的数字集合,返回所有可能的唯一排列。例如,[1,1,2]有以下内容

一些固定数字的排列

优化一个简单的缺失词算法[重复]

找到给定字符串的每个可能的子集[重复]

按位移位以在 C 中生成所有可能的排列 [重复]