【问题标题】:How to merge strings with overlapping characters in python?如何在python中合并字符串与重叠字符?
【发布时间】:2019-03-02 21:10:02
【问题描述】:

我正在开发一个 python 项目,该项目读取一个 URL 编码的重叠字符串列表。每个字符串的长度为 15 个字符,并与其顺序字符串重叠至少 3 个字符,最多 15 个字符(相同)。

该程序的目标是从重叠字符串列表(有序或无序)转换为压缩的 URL 编码字符串。

我当前的方法在重叠字符串中的重复段处失败。例如,我的程序组合错误:

StrList1 = [ 'd+%7B%0A++++public+', 'public+static+v','program%0Apublic+', 'ublic+class+Hel', 'lass+HelloWorld', 'elloWorld+%7B%0A+++', '%2F%2F+Sample+progr', 'program%0Apublic+']

输出:

output = ['ublic+class+HelloWorld+%7B%0A++++public+', '%2F%2F+Sample+program%0Apublic+static+v`]

当正确的输出是:

output = ['%2F%2F+Sample+program%0Apublic+class+HelloWorld+%7B%0A++++public+static+v']

我使用的是简单的 python,而不是 biopython 或序列比对器,但也许我应该使用?

非常感谢任何关于此事的建议或在 python 中执行此操作的好方法的建议!

谢谢!

【问题讨论】:

    标签: python string merge string-comparison sequence-alignment


    【解决方案1】:

    您可以从列表中的一个字符串(存储为string)开始,然后对于列表中的每个剩余字符串(存储为candidate),其中:

    • candidatestring 的一部分,
    • candidate 包含 string
    • candidate的尾巴和string的头匹配,
    • 或者,candidate的头部匹配string的尾部,

    根据两个字符串的重叠方式组装两个字符串,然后递归重复该过程,从剩余字符串中删除重叠字符串并附加组装字符串,直到列表中只剩下一个字符串,此时它是可以添加到最终输出中的有效完全组装字符串。

    由于多个字符串可能有多种方式相互重叠,其中一些可能导致相同的组合字符串,因此您应该输出一组字符串:

    def assemble(str_list, min=3, max=15):
        if len(str_list) < 2:
            return set(str_list)
        output = set()
        string = str_list.pop()
        for i, candidate in enumerate(str_list):
            matches = set()
            if candidate in string:
                matches.add(string)
            elif string in candidate:
                matches.add(candidate)
            for n in range(min, max + 1):
                if candidate[:n] == string[-n:]:
                    matches.add(string + candidate[n:])
                if candidate[-n:] == string[:n]:
                    matches.add(candidate[:-n] + string)
            for match in matches:
                output.update(assemble(str_list[:i] + str_list[i + 1:] + [match]))
        return output
    

    这样使用您的示例输入:

    StrList1 = ['d+%7B%0A++++public+', 'public+static+v','program%0Apublic+', 'ublic+class+Hel', 'lass+HelloWorld', 'elloWorld+%7B%0A+++', '%2F%2F+Sample+progr', 'program%0Apublic+']

    assemble(StrList1) 会返回:

    {'%2F%2F+Sample+program%0Apublic+class+HelloWorld+%7B%0A++++public+static+v'}
    

    或者作为具有各种重叠可能性的输入示例(第二个字符串可以通过在内部匹配第一个字符串,尾部匹配头部,头部匹配尾部):

    assemble(['abcggggabcgggg', 'ggggabc'])
    

    会返回:

    {'abcggggabcgggg', 'abcggggabcggggabc', 'abcggggabcgggggabc', 'ggggabcggggabcgggg'}
    

    【讨论】:

    • 一个不错的递归方法!
    猜你喜欢
    • 2018-04-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-22
    • 2023-03-09
    • 2015-11-23
    • 1970-01-01
    • 2014-11-01
    相关资源
    最近更新 更多