簡體   English   中英

使用迭代而非內置函數模擬Python str.find(substring)

[英]Emulate Python str.find(substring) using iteration but not built-in functions

如何在不使用Python中的str.find()情況下找到字符串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()工作原理

您可以使用Boyer-MooreKnuth-Morris-Pratt 兩者都創建表以預先計算每次未擊中的更快動作。 BM頁面具有python實現。 這兩頁都引用了其他字符串搜索算法。

在不使用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)

我完全不考慮沒有任何內置功能的方法。

我完全不考慮沒有任何內置功能的方法。

我可以:

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'))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM