Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.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
使用迭代而不是内置函数模拟Python str.find(子字符串)_Python_String_Find_Substring - Fatal编程技术网

使用迭代而不是内置函数模拟Python str.find(子字符串)

使用迭代而不是内置函数模拟Python str.find(子字符串),python,string,find,substring,Python,String,Find,Substring,如果不在Python中使用str.find(),如何在字符串中查找子字符串的位置?我应该如何循环它 def find substring(string,substring): for i in xrange(len(string)): if string[i]==substring[0]: print i else: print false 例如,当string=“ATACGTG”和substring=“ACGT”时,它应该返回2。

如果不在Python中使用
str.find()
,如何在字符串中查找子字符串的位置?我应该如何循环它

def find substring(string,substring):
     for i in xrange(len(string)):
        if string[i]==substring[0]:
          print i
        else: print false

例如,当
string=“ATACGTG”
substring=“ACGT”
时,它应该返回
2
。我想了解
str.find()
是如何工作的

在不使用
find
的约束下,您可以使用
str.index
,如果未找到子字符串,它将返回一个ValueError:

def find_substring(a_string, substring):
    try:
        print(a_string.index(substring))
    except ValueError:
        print('Not Found')
使用方法:

>>> find_substring('foo bar baz', 'bar')
4
>>> find_substring('foo bar baz', 'quux')
Not Found
如果必须循环,可以这样做,即沿字符串滑动,然后使用匹配的第一个字符检查字符串的其余部分是否与匹配的子字符串开始:

def find_substring(a_string, substring):
    for i, c in enumerate(a_string):
        if c == substring[0] and a_string[i:].startswith(substring):
            print(i)
            return
    else: 
        print(False)
要使用无字符串方法执行此操作,请执行以下操作:

def find_substring(a_string, substring):
    for i in range(len(a_string)):
        if a_string[i] == substring[0] and a_string[i:i+len(substring)] == substring:
            print(i)
            return
    else: 
        print(False)
如果没有任何内置函数,我想不出一种方法来实现它。

您可以使用或。这两种方法都会创建表格,以预先计算每次未命中时的更快移动。B-M页面有一个python实现。这两个页面都引用了其他字符串搜索算法

如果没有任何内置函数,我想不出一种方法来实现它

我可以:

def find_substring(string, substring):

    def starts_with(string, substring):
        while True:
            if substring == '':
                return True

            if string == '' or string[0] != substring[0]:
                return False

            string, substring = string[1:], substring[1:]

    n = 0

    while string != '' and substring != '':

        if starts_with(string, substring):
            return n

        string = string[1:]

        n += 1

    return -1

print(find_substring('ATACGTG', 'ACGT'))
例如,避免使用内置的
len()
range()
,等等。如果不使用内置的
len()
,我们会失去一些效率,因为我们本可以更快地完成。OP指定了上面使用的迭代,但递归变量更紧凑:

def find_substring(string, substring, n=0):

    def starts_with(string, substring):
        if substring == '':
            return True

        if string == '' or string[0] != substring[0]:
            return False

        return starts_with(string[1:], substring[1:])

    if string == '' or substring == '':
        return -1

    if starts_with(string, substring):
        return n

    return find_substring(string[1:], substring, n + 1)

print(find_substring('ATACGTG', 'ACGT'))

我的解决方案对您来说是如何工作的?索引与find基本相同。我想在不使用任何内置函数的情况下解决这个问题。我的想法是:如果字符串中有子字符串,则找到i,其中字符串[i]=子字符串[0],并返回i。我不熟悉Python您正在使用内置函数xrange和len,您是说没有字符串方法吗?构建自己的
find
函数不可避免地要慢得多,因为Python的许多内置函数都经过了速度优化和/或是用C编写的。创建自己的函数的原因是什么?看起来您正在搜索基因组数据,速度可能至关重要。有关
find
在Python中实际如何工作的详细信息,请参阅此问题。index与find基本相同。我想在不使用任何内置设备的情况下解决这个问题functions@Nur这是怎么回事,没有索引?另一个问题中的答案表明Python
find
实现是基于Boyer Moore的——是的,我肯定是这样。不过,我不知道你的意思是什么。这不是一个好的答案,因为它在python中复制了C中的底层实现吗?如果你必须在python中从头开始实现
string.find
,你会怎么做?对我来说,这似乎是一个非常相关的答案,这就是我投票的原因。我只是提供了更多的信息——如果听起来很关键,我很抱歉。