如何有效地生成具有多个(可能重复的)字母的所有唯一单词

时间:2014-10-18 14:04:09

标签: python permutation itertools

我有很多信说三个a和两个b,我想找到所有可能的单词。我尝试了itertools.permutationsitertools.product,但他们没有帮助,因为:

1)结果permutations包含重复(即同一个单词出现多次)。例如:

> print [''.join(i) for i in itertools.permutations('aab', 3)]
['aab', 'aba', 'aab', 'aba', 'baa', 'baa']

2)product的结果可以包含仅包含其中一个字母的单词:

> print [''.join(i) for i in itertools.product('ab', repeat=3)]
['aaa', 'aab', 'aba', 'abb', 'baa', 'bab', 'bba', 'bbb']

有两个a和一个b我想得到'['aab','aba','baa']。此外,我需要使用迭代器而不是列表的方法(或任何其他方式将所有内容存储在内存中),因为结果可能非常大。

2 个答案:

答案 0 :(得分:2)

def _permute(xs):
    if not xs:
        yield ()
    for x in xs:
        xs[x] -= 1
        if not xs[x]:
            xs.pop(x)
        for ys in _permute(xs):
            yield (x,) + ys
        xs[x] += 1

from collections import Counter
def permute(xs):
    return _permute(Counter(xs))

用法:

>>> list(permute('aab'))
[('a', 'a', 'b'), ('a', 'b', 'a'), ('b', 'a', 'a')]
>>> [''.join(xs) for xs in permute('aab')]
['aab', 'aba', 'baa']
>>> map(''.join, permute('aab'))  # list(map(...)) in Python 3.x
['aab', 'aba', 'baa']

答案 1 :(得分:-1)

我喜欢这个问题!

  1. 将字符列表拆分为不重复的字符列表和。
  2. 您可以使用itertools一次生成一个非重复字符的唯一排列。
  3. 对于每个重复的字符,您可以生成一次插入一个字符的方法。 (这需要单独完成,因此我们不会将这些重复的不同顺序视为不同。)