给定一个字符串,我想生成所有可能的组合。换句话说,将逗号放在字符串中的所有可能方法。
例如:
input: ["abcd"]
output: ["abcd"]
["abc","d"]
["ab","cd"]
["ab","c","d"]
["a","bc","d"]
["a","b","cd"]
["a","bcd"]
["a","b","c","d"]
我对如何生成所有可能的列表感到有些困惑。组合将只给出包含字符串集子集长度的列表,排列将提供所有可能的订购方式。
由于遍历切片,我可以使列表中只有一个逗号的所有情况,但是我不能用“ab”,“c”,“d”和“a”等两个逗号创建案例, “b”, “CD”
我的尝试w / slice:
test="abcd"
for x in range(len(test)):
print test[:x],test[x:]
答案 0 :(得分:15)
如下:
from itertools import combinations
def all_splits(s):
for numsplits in range(len(s)):
for c in combinations(range(1,len(s)), numsplits):
split = [s[i:j] for i,j in zip((0,)+c, c+(None,))]
yield split
之后:
>>> for x in all_splits("abcd"):
... print(x)
...
['abcd']
['a', 'bcd']
['ab', 'cd']
['abc', 'd']
['a', 'b', 'cd']
['a', 'bc', 'd']
['ab', 'c', 'd']
['a', 'b', 'c', 'd']
答案 1 :(得分:15)
你当然可以使用itertools
,但我认为直接编写递归生成器更容易:
def gen_commas(s):
yield s
for prefix_len in range(1, len(s)):
prefix = s[:prefix_len]
for tail in gen_commas(s[prefix_len:]):
yield prefix + "," + tail
然后
print list(gen_commas("abcd"))
打印
['abcd', 'a,bcd', 'a,b,cd', 'a,b,c,d', 'a,bc,d', 'ab,cd', 'ab,c,d', 'abc,d']
我不确定为什么我觉得这更容易。也许只是因为直接做到这一点很容易; - )
答案 2 :(得分:3)
使用itertools:
import itertools
input_str = "abcd"
for k in range(1,len(input_str)):
for subset in itertools.combinations(range(1,len(input_str)), k):
s = list(input_str)
for i,x in enumerate(subset): s.insert(x+i, ",")
print "".join(s)
给出:
a,bcd
ab,cd
abc,d
a,b,cd
a,bc,d
ab,c,d
a,b,c,d
也是一个递归版本:
def commatoze(s,p=1):
if p == len(s):
print s
return
commatoze(s[:p] + ',' + s[p:], p + 2)
commatoze(s, p + 1)
input_str = "abcd"
commatoze(input_str)
答案 3 :(得分:3)
答案 4 :(得分:1)
您可以解决integer composition problem并使用合成来指导拆分列表的位置。通过一点动态编程可以很容易地解决整数组合。
def composition(n):
if n == 1:
return [[1]]
comp = composition (n - 1)
return [x + [1] for x in comp] + [y[:-1] + [y[-1]+1] for y in comp]
def split(lst, guide):
ret = []
total = 0
for g in guide:
ret.append(lst[total:total+g])
total += g
return ret
lst = list('abcd')
for guide in composition(len(lst)):
print split(lst, guide)
生成整数组合的另一种方法:
from itertools import groupby
def composition(n):
for i in xrange(2**(n-1)):
yield [len(list(group)) for _, group in groupby('{0:0{1}b}'.format(i, n))]
答案 5 :(得分:0)
给出
index.tsx
代码
import more_itertools as mit
输出
list(mit.partitions("abcd"))
通过[[['a', 'b', 'c', 'd']],
[['a'], ['b', 'c', 'd']],
[['a', 'b'], ['c', 'd']],
[['a', 'b', 'c'], ['d']],
[['a'], ['b'], ['c', 'd']],
[['a'], ['b', 'c'], ['d']],
[['a', 'b'], ['c'], ['d']],
[['a'], ['b'], ['c'], ['d']]]
安装more_itertools
。