Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/291.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
DNA从字符串中的列表中查找所有匹配项(python 2.7)_Python_String_List_Find - Fatal编程技术网

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

DNA从字符串中的列表中查找所有匹配项(python 2.7),python,string,list,find,Python,String,List,Find,嘿,我有一串字母(它是DNA),我有一个来自另一个序列的切片DNA列表。我想在我的字符串中查找列表中所有项目的所有匹配项。 基本上: data_1 = "ATGCTGCATGTCATGTGCTGATCTG" wild_type = ["A", "TG", "ATGC", "ATG", "TGCT", "GTA", "GTACT", "GT", "CT"] 我希望输出是data_1中的索引列表,其中找到了来自wild_类型的匹配项 此外,我想找到最长的一块匹配。所以对于字符串的第一部分,A,AT

嘿,我有一串字母(它是DNA),我有一个来自另一个序列的切片DNA列表。我想在我的字符串中查找列表中所有项目的所有匹配项。 基本上:

data_1 = "ATGCTGCATGTCATGTGCTGATCTG"
wild_type = ["A", "TG", "ATGC", "ATG", "TGCT", "GTA", "GTACT", "GT", "CT"]
我希望输出是data_1中的索引列表,其中找到了来自wild_类型的匹配项

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


我尝试使用finditer,但我不知道如何将我的列表或字符串放入其中。任何帮助都将不胜感激

您可以使用
re.search()
查找字符串中的匹配项,然后使用
span
方法获取匹配项的位置并将其存储到字典中的位置(使用)根据此逻辑,第一个位置是键,公共末端位置作为值列在列表中,然后使用
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)]

对于第一个问题,您必须编写一个函数,该函数完全满足您的要求,它得到两个字符串,然后返回出现在第一个中的第二个的索引:

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-暴力
对于你所有的野生类型,检查它!如果可以在数据_1中找到最长的野生类型,那么它就是最长的公共字符串!因为没有字符串长度超过最长的通配符类型:))

2-搜索python实现(LCS=最长公共子字符串):

它使用动态规划方法解决您的问题

是否希望范围作为元组列表?在多个范围中会发生什么?是的,一个元组列表。所以像“CA”一样,会有[6,7]和[11,12]打印。首先,这是一种非常不符合音速的方式来执行此任务,其次,OP想要最大范围,而您的代码不会这样做!我试过这个,但对我不起作用。这有点让人困惑,因为我是一个初级程序员。@bioinfo221它怎么不工作?出了什么问题?你的任务并不简单,所以它的解决方案也不会很简单!;)告诉我你在这里什么地方含糊不清@bioinfo221由于您处理的是生物信息数据,您需要学习使用经过优化的方法,因为在大字符串或其他大数据中,如果您的代码没有得到优化,您将遇到许多问题。
>>> 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]
>>>