Python 2.7 在Python中从子集生成字符串匹配

Python 2.7 在Python中从子集生成字符串匹配,python-2.7,Python 2.7,我有一个使用itertools置换的问题解决方案,但是对于比我的示例更大的用例,它在计算上是昂贵的 基本上,我以一个字符串形式的句子开始,简化为: a=“a b c d” 通过一个不同的过程,我得到了字符串子集的列表,例如: suba=[“d”、“cd”、“bcd”、“ab”、“bc”、“abc”、“abc”、“a”] 我想要的结果是一个组合列表,这些组合来自suba,可以连接起来生成a,例如: [('ab','cd'),('abc','d'),('a','bcd'),('a','bc','d'

我有一个使用itertools置换的问题解决方案,但是对于比我的示例更大的用例,它在计算上是昂贵的

基本上,我以一个字符串形式的句子开始,简化为:

a=“a b c d”

通过一个不同的过程,我得到了字符串子集的列表,例如:

suba=[“d”、“cd”、“bcd”、“ab”、“bc”、“abc”、“abc”、“a”]

我想要的结果是一个组合列表,这些组合来自suba,可以连接起来生成a,例如:

[('ab','cd'),('abc','d'),('a','bcd'),('a','bc','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

首先生成组合,因为组合比置换少,所以速度更快。只有字符串长度正确,才会生成该特定组合的各种排列

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毫秒,而您的方法需要2.023毫秒。边距应随着子字符串数量的增加而增加提示:
a
中的字数为4。不需要尝试5个或更多元素的排列,因为它总是产生错误的结果。