我有很多信说三个a和两个b,我想找到所有可能的单词。我尝试了itertools.permutations
和itertools.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']。此外,我需要使用迭代器而不是列表的方法(或任何其他方式将所有内容存储在内存中),因为结果可能非常大。
答案 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)
我喜欢这个问题!
itertools
一次生成一个非重复字符的唯一排列。