在Python中从子集构建字符串匹配

时间:2013-12-02 18:33:35

标签: python-2.7

我使用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

1 个答案:

答案 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。随着子串数的增加,边际应该会增加