2014-02-18 72 views
2

對於學校項目,我必須創建一個名爲find_str的函數,它基本上與.find字符串方法做同樣的事情,但我們不能在我們的定義中使用任何字符串方法。創建您自己的查找字符串函數

項目描述爲:「函數find_str有兩個參數(兩個字符串)。它返回最低索引,第一個參數中找到第二個參數(如果在第一個參數中沒有找到第二個參數,則返回-1參數)。」

我花了很多時間在這個項目上工作,還沒有找到解決辦法。這是我想出了目前的定義:

def find_str (string, substring): 
    index = 0 
    length = len (substring) 
    for ch in string: 
     if ch == substring [0]: 
      subindex1 = 0 
      subindex2 = index 
      for i in range (length): 
       if ch == substring [i]: 
        subindex1 +=1 
        if subindex1 == length: 
         return index 
        ch = string [(subindex2)+1] 
        subindex2 +=1 
     index += 1 
    return "-1" 

的代碼此示例只能在某些情況下,但不是全部。

例如:

print (find_str ("hello", "llo")) 

回報:

2 
,因爲它應該

print (find_str ("hello", "el")) 

回報:

ch = string [(subindex2)+1] 
IndexError: string index out of range 

我覺得我這得太多,並必須有一個更簡單的方法來做到這一點。任何輸入或幫助將是偉大的!謝謝。

+1

您能否具體說明您的功能何時失效 - 哪些輸入,以及它如何失敗?預期輸出與實際等等 – Blorgbeard

+0

例如:print(find_str(「hello」,「llo」))返回索引2,這是正確的。但是,打印(find_str(「hello」,「el」))返回錯誤 「ch = string [(subindex2)+1] IndexError:字符串索引超出範圍」應該返回索引1時。 – Chadmmiles

+0

您可以使用其他Python模塊,如正則表達式?如果是這樣,你可以匹配主字符串中子字符串的正則表達式並返回它。它不使用任何python字符串方法,只是一個不同的python模塊。 –

回答

1

FF使用子功能清除你的想法通常會有所幫助。

def find_str (string, substring): 
    index = 0 
    length = len (substring) 
    for j in range(len(string)): 
     if is_next_sub(string, substring, j): 
      return j   
    return "-1" 

def is_next_sub(string, substring, index): 
    for i in range(len(substring)): 
     if substring[i] != string[index + i]: 
      return False 
    return True 
+0

非常感謝您的回覆!試圖將我的整個功能塞進一個功能變得有些複雜。我很欣賞這個建議。 – Chadmmiles

1

我不知道我們應該用「功課」

可以幫你這個怎麼樣:

def find_str(string, substring): 
    for off in xrange(len(string)): 
     if string[off:].startswith(substring): 
      return off 
    return -1 
+0

沒有必要尋找某人把答案提交給我,因爲它是爲了學校,只是希望有更多經驗的人可以指引我走向正確的方向。我很欣賞這種迴應,但是,我們不允許使用.startswith字符串方法。 – Chadmmiles

+0

良好的迴應。無論如何,如果你不能使用.startswith,你可以很容易地修改這個例子來重寫slice語法來指定長度(對於你來說exersize)。 – user590028

+0

你能解釋一下.startswith方法在這個例子中實際上在做什麼?再次,我是python的新手,我試圖理解爲什麼輸入:print(find_str(「hello」,「lo」)) - 程序會知道爲什麼第一個「l」不是子字符串的一部分。如果我能理解它所服務的目的,那麼我可以實現我自己的解決方案。 – Chadmmiles

0

我沒有經過詳細的代碼進行覈對,但看起來就像你試圖比較不存在的字符一樣。

假設您正在搜索「AAAAA」爲串「AAA」,你需要找到所有匹配...

String  : aaaaa 
Match at 0 : aaa.. 
Match at 1 : .aaa. 
Match at 2 : ..aaa 

即使人物總是匹配,然後將字符串中有五個字符,你只需要考慮三個職位。

因此,在您查看實際字符之前,您可以根據字符串和子字符串的長度來限制可能需要考慮的起始位置數。你只循環這些起始位置。這意味着你不會循環尋找不匹配的開始位置。此外,如果你做到這一點...

String  : aaaaa 
Match at 0 : aaa.. 
Match at 1 : .aaa. 
Match at 2 : ..aaa 
Match at 3 : ...aa! 
Match at 4 : ....a!! 

那些感嘆號,在那裏你嘗試匹配與不存在的字符的字符串的字符的地方,的結束後,串。您可以在循環中檢查以避免錯誤發生,但爲什麼不通過循環不匹配不匹配的位置來消除所有這些情況?

您可能需要檢查的起始位置數量爲len(fullstring) + 1 - len(substring),因此您可以使用range(0, len(fullstring) + 1 - len(substring))推導出一系列可能的起始位置。