DNA 从字符串中的列表中找到所有匹配项 (python 2.7)

DNA find all matching items from a list in a string (python 2.7)

嘿,所以我有一串字母(它是 DNA),我还有一个来自另一个序列的切片 DNA 列表。我想在我的字符串中找到列表中所有出现的任何项目。 基本上:

data_1 = "ATGCTGCATGTCATGTGCTGATCTG"
wild_type = ["A", "TG", "ATGC", "ATG", "TGCT", "GTA", "GTACT", "GT", "CT"]

我希望输出是 data_1 中的索引列表,其中找到了来自 wild_type 的匹配项。

此外,我想找到匹配的最长片段。所以对于字符串的第一部分,AATGATGC 都匹配,所以我不需要它吐出 [0,1,2,3],而只是 [0,3](一个范围)

我尝试使用 finditer,但我不知道如何将我的列表或字符串放在那里。任何帮助将不胜感激!

您可以使用 re.search() 找到字符串中的匹配项,然后使用 span 方法获取匹配项的位置并存储到字典中的位置(使用 dict.setdefault method )按照这种逻辑,第一个位置是键,公共结束位置在列表中作为值,然后使用 max 函数找到最大范围:

>>> d={}
>>> from operator import sub
>>> for i in wild_type:
...    match=re.search('{}'.format(i),data_1)
...    if match:
...       i,j=match.span()
...       d.setdefault(i,[]).append(j)
>>> d
{0: [1, 4, 3], 1: [3, 5], 3: [5], 9: [11]}
>>> max(((i,j[-1]) for i,j in d.items()),key=lambda x:abs(sub(*x)))
(1, 5)

如果你想要所有的比赛,就像你在评论中说的那样,你可以这样做:

>>> [(i,j[-1]) for i,j in d.items()]
[(0, 3), (1, 5), (3, 5), (9, 11)]

对于你的第一个问题,你必须编写一个函数来完成你想要的,它得到两个字符串,然后 return 第二个出现的索引第一:

def my_find(str1,str2):
    start = 0
    end = len(str1)
    all_finds = []
    while str1.find(str2,start,end) != -1 :
        x = str1.find(str2,start,end)
        all_finds.append(x)
        start = x+1

    return all_finds

然后检查所有野生类型:

for item in wild_type :
    print my_find(data_1,item)

结果是这样的:

[0, 7, 12, 20]
[1, 4, 8, 13, 15, 18, 23]
[0]
[0, 7, 12]
[1, 15]
[]
[]
[9, 14]
[3, 17, 22]

如果你检查你看到第一个是 "A" ,它首先出现在索引 0 然后 7 和 ....

对于你的第二个问题,有两种方法!第一种更容易但更慢,第二种更难实现但更快!取决于你的数据集尺寸,你必须选择一个:

1-暴力破解吧!:
对于你所有的野生类型,检查它!如果你能在 data_1 中找到最长的野生类型,那么它就是最长的普通字符串!因为没有字符串会比最长的 wild_type :))

>>> max_len = -1
>>> max_cut = [-1,-1]
>>> for item in wild_type:
    if my_find(data_1,item) and len(item) > max_len:
        max_len = len(item)
        max_cut[0] = my_find(data_1,item)[0]
        max_cut[1] = my_find(data_1,item)[0]+len(item)


>>> max_len
4
>>> max_cut
[0, 4]
>>> 

2- 搜索 LCS python 实现,(LCS = 最长公共子串):
它使用动态规划方法并解决了您的问题