Python 字符串的所有可能组合

Posted

技术标签:

【中文标题】Python 字符串的所有可能组合【英文标题】:Python every possible combination of a string 【发布时间】:2015-05-06 09:37:04 【问题描述】:

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

字符串:x = 'god'

结果:

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

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

【问题讨论】:

【参考方案1】:

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

【讨论】:

哇!真是一场竞赛,不到几分钟就三个正确答案。漂亮的单线。【参考方案2】:

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

【讨论】:

【参考方案3】:

您想使用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']

【讨论】:

【参考方案4】:

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

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找到

【讨论】:

【参考方案5】:
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 调用中会消耗你所渴望的一样多的内存!-)

【讨论】:

以上是关于Python 字符串的所有可能组合的主要内容,如果未能解决你的问题,请参考以下文章

如何生成字符之间带有空格的字符串的所有可能组合? Python

Python 3.3:拆分字符串并创建所有组合

Python 轻松解决从 K 个字符串数组中任意取一个字符串,按顺序拼接,列出所有可能的字符串组合。(对比用库和不用库的方法)

使用一组字符串生成所有可能的组合

获取数组中所有可能的字符组合

用一组字符替换字符串中的“#”,给出所有可能的字符串组合[关闭]