如何编写函数以在不使用'find'函数的情况下查找较大字符串中子字符串的位置?

时间:2019-02-09 22:53:06

标签: python string list substring linear-search

我最近才开始使用python,对python和编码来说我是一个非常陌生的人,我在一个类中,我们得到了分配任务,以寻找在Python中使用两个DNA字符串序列的函数(例如string1和string2)作为输入,并返回string2作为string1的子字符串存在的位置的列表。而且由于我们应该熟悉编码的工作方式,因此无法使用“查找”内置函数。我真的对如何开始这个问题感到困惑。但这是我到目前为止的内容:

def linear(seq, sub):
    positions = [0]
    for i in range(len(sub)):
        if seq[i:i+len(sub)] == sub:
             positions[0]+=1
    return( positions )

当我把它放进去的时候我得到一个错误,但是我应该得到一个出现子串的位置的清单。如果有人可以指导我应该朝哪个方向发展,那将真的很有帮助。

例如,如果序列为“ ATTCCATGGACCTAGTCAT”,而我要查找的子字符串为“ CAT”,则输出应为[5,17]

1 个答案:

答案 0 :(得分:1)

不幸的是,它不能为[5,17],因为python中的索引从0开始,应该为[4,16]。您可以使用for循环遍历索引,直到最后一个索引减去子字符串的长度再加上1,以免超出范围。然后,您检查字符串的分片,即直到当前索引为止的当前索引加上子字符串的长度(如果为'CAT',则获得该分片的3长度的每个分片字符串),等于子字符串。如果是这样,则将索引附加到索引列表中。

def find(st,sub):
    list_of_pos=[]
    for i in range(len(st)-len(sub)+1):
        if st[i:i+len(sub)]==sub:
            list_of_pos.append(i)
    return list_of_pos

如果使用列表理解,则可以使其更紧凑:

def find(st,sub):
    return [i for i in range(len(st)-len(sub)+1) if st[i:i+len(sub)]==sub]