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