如何生成字符之间带有空格的字符串的所有可能组合?python
如何生成字符之间带有空格的字符串的所有可能组合如何生成字符之间带有空格的字符串的所有可能组合?python,python,string,whitespace,combinations,Python,String,Whitespace,Combinations,如何生成字符之间带有空格的字符串的所有可能组合 [in]: "foobar" [out]: ['foobar', 'f oobar', 'fo obar', 'f o obar', 'foo bar', 'f oo bar', 'fo o bar', 'f o o bar', 'foob ar', 'f oob ar', 'fo ob ar', 'f o ob ar', 'foo b ar', 'f oo b ar', 'fo o b ar', 'f o o b ar', 'fooba
[in]: "foobar"
[out]:
['foobar', 'f oobar', 'fo obar', 'f o obar', 'foo bar', 'f oo bar', 'fo o bar',
'f o o bar', 'foob ar', 'f oob ar', 'fo ob ar', 'f o ob ar', 'foo b ar',
'f oo b ar', 'fo o b ar', 'f o o b ar', 'fooba r', 'f ooba r', 'fo oba r',
'f o oba r', 'foo ba r', 'f oo ba r', 'fo o ba r', 'f o o ba r', 'foob a r',
'f oob a r', 'fo ob a r', 'f o ob a r', 'foo b a r', 'f oo b a r', 'fo o b a r',
'f o o b a r', 'foobar', 'f oobar', 'fo obar', 'f o obar', 'foo bar',
'f oo bar', 'fo o bar', 'f o o bar', 'foob ar', 'f oob ar', 'fo ob ar',
'f o ob ar', 'foo b ar', 'f oo b ar', 'fo o b ar', 'f o o b ar', 'fooba r',
'f ooba r', 'fo oba r', 'f o oba r', 'foo ba r', 'f oo ba r', 'fo o ba r',
'f o o ba r', 'foob a r', 'f oob a r', 'fo ob a r', 'f o ob a r', 'foo b a r',
'f oo b a r', 'fo o b a r', 'f o o b a r']
这可能不是最有效的方法,但我会列出两个列表。一个元素的每个元素都有一个字母,另一个元素的每个字母后面都有一个空格。(每次跳过最后一个字母,因为它总是没有空格。)通过在每个字母的两个列表之间进行选择(可以建模为二进制数,其中0=没有空格,1=空格)生成可能的间距 输出:
['f oobar',
'fo obar',
'foo bar',
'foob ar',
'fooba r',
'f o obar',
'f oo bar',
'f oob ar',
'f ooba r',
'fo o bar',
'fo ob ar',
'fo oba r',
'foo b ar',
'foo ba r',
'foob a r',
'f o o bar',
'f o ob ar',
'f o oba r',
'f oo b ar',
'f oo ba r',
'f oob a r',
'fo o b ar',
'fo o ba r',
'fo ob a r',
'foo b a r',
'f o o b ar',
'f o o ba r',
'f o ob a r',
'f oo b a r',
'fo o b a r',
'f o o b a r']
更新:
您提到您需要“字符之间带有空格的字符串的所有可能组合”,但同时您在[Out]
中提供的示例并没有反映这一点(即您有“foo bar”
两次,“fooba r”
缺失,等等)
在这个答案中,我假设您真的希望使用itertools库“所有可能的字符串组合,字符之间有空格”(但它与Titandrake几乎相同):
下面是我上述递归思想的一个实现:
def string_spaces(s):
ret = set([s]) # use a set rather than a list to prevent duplicates
for i in range(1, len(s)):
for fst in string_spaces(s[:i]):
for snd in string_spaces(s[i:]):
ret.add(fst + ' ' + snd)
return ret
例如:
In [11]: string_spaces('foo')
Out[11]: set(['foo', 'f o o', 'f oo', 'fo o'])
注意:Python的递归限制为1000个堆栈帧,因此对于非常长的字符串(超过1000个字符)这将崩溃
输出:
['foobar',
'fooba r',
'foob ar',
'foob a r',
'foo bar',
'foo ba r',
'foo b ar',
'foo b a r',
'fo obar',
'fo oba r',
'fo ob ar',
'fo ob a r',
'fo o bar',
'fo o ba r',
'fo o b ar',
'fo o b a r',
'f oobar',
'f ooba r',
'f oob ar',
'f oob a r',
'f oo bar',
'f oo ba r',
'f oo b ar',
'f oo b a r',
'f o obar',
'f o oba r',
'f o ob ar',
'f o ob a r',
'f o o bar',
'f o o ba r',
'f o o b ar',
'f o o b a r']
递归解。(对于较长的字符串,可能需要使用
sys.setrecursionlimit()
):
def gen_perm(my_str):
如果LEN(MyOSTR)提示:您可能会考虑在每个位置拆分一个字符串,然后递归地为每个子字符串做同样的事情。为什么这么多地改变了您的输出?不是一般的解决方案。两者都不是有效的。实际上,你只需要增加到2**4(16个组合),因为你必须去掉单词的第一个和最后一个字母。解决方案并不完全正确,因为最后一个字母后面应该没有空格。这也减少了可能性的数量。现在修好了。事实上,这是不正确的。这会生成所有可能的方法来添加空间,但问题实际上并没有要求这样做。例如,foobar
并没有作为例子列出。@Titandrake我想OP也需要这些。但是在所提供的示例中遗漏了这些组合。@jamylak--不,没有。您有32个组合,而OP的组合是64个。你的组合也是反向的。类似于product中x的(“”),repeat=len(text)):
L.append(“”.join(chain.from_iterable(izip(text,reversed(x)))).rstrip()
应该修复it@jamylak-它提供了所有可能的组合-但没有重复set(myres)==set(OPres)
:)您可以添加如果不是s:return[s]
,以支持空字符串@贾米拉克:(注意:-1
在电源中,因为一根绳子需要三次和平,我们只需要两次切割)。非常优雅。我从来没有想过使用产品
和反向
这种方式=)
def string_spaces(s):
ret = set([s]) # use a set rather than a list to prevent duplicates
for i in range(1, len(s)):
for fst in string_spaces(s[:i]):
for snd in string_spaces(s[i:]):
ret.add(fst + ' ' + snd)
return ret
In [11]: string_spaces('foo')
Out[11]: set(['foo', 'f o o', 'f oo', 'fo o'])
import itertools as it
def func(s):
if not s:
return [s]
binary = it.product(['',' '], repeat=len(s)-1)
zipped = (it.izip_longest(s , comb, fillvalue='') for comb in binary)
return [''.join(it.chain.from_iterable(x)) for x in zipped]
func('foobar')
['foobar',
'fooba r',
'foob ar',
'foob a r',
'foo bar',
'foo ba r',
'foo b ar',
'foo b a r',
'fo obar',
'fo oba r',
'fo ob ar',
'fo ob a r',
'fo o bar',
'fo o ba r',
'fo o b ar',
'fo o b a r',
'f oobar',
'f ooba r',
'f oob ar',
'f oob a r',
'f oo bar',
'f oo ba r',
'f oo b ar',
'f oo b a r',
'f o obar',
'f o oba r',
'f o ob ar',
'f o ob a r',
'f o o bar',
'f o o ba r',
'f o o b ar',
'f o o b a r']
from itertools import product
text = "foobar"
L = [''.join(reversed(x)).rstrip()
for x in product(*[(c, c+' ') for c in reversed(text)])]
print L
['foobar', 'f oobar', 'fo obar', 'f o obar', 'foo bar', 'f oo bar', 'fo o bar', 'f o o bar', 'foob ar', 'f oob ar', 'fo ob ar', 'f o ob ar', 'foo b ar', 'f oo b ar', 'fo o b ar', 'f o o b ar', 'fooba r', 'f ooba r', 'fo oba r', 'f o oba r', 'foo ba r', 'f oo ba r', 'fo o ba r', 'f o o ba r', 'foob a r', 'f oob a r', 'fo ob a r', 'f o ob a r', 'foo b a r', 'f oo b a r', 'fo o b a r', 'f o o b a r', 'foobar', 'f oobar', 'fo obar', 'f o obar', 'foo bar', 'f oo bar', 'fo o bar', 'f o o bar', 'foob ar', 'f oob ar', 'fo ob ar', 'f o ob ar', 'foo b ar', 'f oo b ar', 'fo o b ar', 'f o o b ar', 'fooba r', 'f ooba r', 'fo oba r', 'f o oba r', 'foo ba r', 'f oo ba r', 'fo o ba r', 'f o o ba r', 'foob a r', 'f oob a r', 'fo ob a r', 'f o ob a r', 'foo b a r', 'f oo b a r', 'fo o b a r', 'f o o b a r']
def gen_perm(my_str):
if len(my_str) <= 1 :
return [my_str]
rest_perms = gen_perm(my_str[1:])
all_perms = [my_str[0] + perm for perm in rest_perms ] + [my_str[0] + ' ' + perm for perm in rest_perms]
return all_perms
print(gen_perm("foobar"))