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 的匹配项。
此外,我想找到匹配的最长片段。所以对于字符串的第一部分,A
、ATG
、ATGC
都匹配,所以我不需要它吐出 [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 = 最长公共子串):
它使用动态规划方法并解决了您的问题
嘿,所以我有一串字母(它是 DNA),我还有一个来自另一个序列的切片 DNA 列表。我想在我的字符串中找到列表中所有出现的任何项目。 基本上:
data_1 = "ATGCTGCATGTCATGTGCTGATCTG"
wild_type = ["A", "TG", "ATGC", "ATG", "TGCT", "GTA", "GTACT", "GT", "CT"]
我希望输出是 data_1 中的索引列表,其中找到了来自 wild_type 的匹配项。
此外,我想找到匹配的最长片段。所以对于字符串的第一部分,A
、ATG
、ATGC
都匹配,所以我不需要它吐出 [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 = 最长公共子串):
它使用动态规划方法并解决了您的问题