我使用itertools排列解决了我的问题,但是对于比我的例子更大的用例,它的计算成本很高。
基本上我从一个句子开始作为字符串,简化:
a = "a b c d"
通过一个不同的过程,我得到一个字符串子集列表,例如:
suba = ["d","c d","b c d","a b","b c","a b c","a"]
我想要的结果是来自suba的组合列表,这些组合可以连接成一个,例如:
[('a b', 'c d'), ('a b c', 'd'), ('a', 'b c d'), ('a', 'b c', 'd')]
我使用下面的排列方式用蛮力制作了上面的内容,是否有一个计算成本较低的方法?
import itertools
a = "a b c d"
suba = ["d","c d","b c d","a b","b c","a b c","a"]
combos = []
for i in range(len(suba)):
p = itertools.permutations(suba,i)
for j in p:
if ' '.join(j) == a:
combos.append(j)
print combos
答案 0 :(得分:0)
首先生成组合,因为组合少于排列,这种组合更快。只有当字符串长度正确时,才会生成该特定组合的各种排列。
def stringmatch(a, suba):
combos= []
for i in range(len(suba)):
p = itertools.combinations(suba,i)
for j in p:
if len(' '.join(j)) == len(a):
q = itertools.permutations(j, len(j))
for r in q:
if ' '.join(r) == a:
combos.append(r)
return combos
使用给定的示例字符串和子字符串,此方法需要0.061 ms而不是2.023 ms。随着子串数的增加,边际应该会增加