Python 字符串的所有可能组合

Python every possible combination of a string

你好,我正在使用 python,我正在尝试编写一个方法,在给定字符串的情况下,它会找到该字符串的每个组合并将其附加到列表中。我会给出字符串并显示我想要的结果。

字符串:x = 'god'

结果:

lst = ['g', 'o', 'd', 'go', 'gd', 'og', 'od', 'dg', 'do', 'god', 'gdo', 'ogd', 'odg', 'dgo', 'dog']

一个字母只能按照它在给定字符串中出现的次数来使用,所以如果我们的字符串是'god''gg''goo'等是不能追加的.如果这可以使用递归来完成,那就太好了!

您想使用 itertools。从你写的,听起来你想使用 itertools.permutation

>>> import itertools
>>> letters = 'god'
>>> combinations = []
>>> for i in range(len(letters)):
...     combinations.extend(
...         [''.join(x) for x in itertools.permutations(letters, i + 1)])
>>> print(combinations)
['g', 'o', 'd', 'go', 'gd', 'og', 'od', 'dg', 'do', 'god', 'gdo', 'ogd', 'odg', 'dgo', 'dog']

使用itertools.permutations并列出理解

from itertools import permutations
[''.join(j) for i in range(1,len(x) + 1) for j in  permutations(x, i)]

输出

['g', 'o', 'd', 'go', 'gd', 'og', 'od', 'dg', 'do', 'god', 'gdo', 'ogd', 'odg', 'dgo', 'dog']

使用permutations:

from itertools import permutations

x = 'god'


perms = []

for i in range(1, len(x)+1):
    for c in permutations(x, i):
        perms.append("".join(c))

print(perms) 
# ['g', 'o', 'd', 'go', 'gd', 'og', 'od', 'dg', 'do', 'god', 'gdo', 'ogd', 'odg', 'dgo', 'dog']

你在这里要做的是获取你传入的任何字符串的幂集。你要做的是将该字符串转换为字符列表,然后使用幂集的定义来使用简单的列表扩展来创建您正在寻找的内容。

def list_powerset(lst): # the power set of the empty set has one element, the empty set result = [[]] for x in lst: # for every additional element in our set # the power set consists of the subsets that don't # contain this element (just take the previous power set) # plus the subsets that do contain the element (use list # comprehension to add [x] onto everything in the # previous power set) result.extend([subset + [x] for subset in result]) return result

以上代码是在http://rosettacode.org/wiki/Power_set#Python

找到的
import itertools

def _itersubs(x):
    for i in range(1, len(x)+1):
        yield from itertools.permutations(x, i)
        # before 3.4, replace with:
        # for y in itertools.permutations(x, i): yield y

def thefuncyouwant(x):
    return list(_itersubs(x))

我不确定您是否真的想要 2 ** len(x) 项的列表 -- 这需要 很多任何 x 的记忆都不是很短——但是,这是你要求的,所以就在这里。一次生成一项的迭代器显然更自然,而且可能更可取,但仅将其包装在 list 调用中会占用您想要的内存!-)