我正在研究一个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或sequence aligners,尽管也许应该这样做?
非常感谢您对此问题的任何建议或使用python实现此目的的好方法的建议!
谢谢!
答案 0 :(得分:1)
您可以从列表中的一个字符串(存储为string
)开始,对于列表中其余的每个字符串(存储为candidate
),其中:
candidate
是string
的一部分,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'}
答案 1 :(得分:0)
如果链数不超过20,它就会挂起。如何优化呢?