2013-12-11 136 views
0

我一直有這段代碼的問題。似乎我對Python中while循環和縮進的理解仍然不完整。2個字符串之間的匹配字符

在下面的代碼中,我應該比較兩個語句。如果第二個(搜索)語句中的字符位於第一個(目標)語句中,則結果應爲「True」。否則,打印「假」。

x = "I am a horse." 
y = "a r" 
  • targetn是指在目標串的索引
  • searchn指的是在搜索字符串的索引
  • letter指字符在目標串
  • word指字符的搜索字符串
def search_in_string(search, target): 
    targetn = 0 
    searchn = 0 
    while (targetn + 1) != len(target): 
     letter = target[targetn] 
     word = search[searchn] 
     if word == letter: 
      targetn = targetn + 1 
      searchn = searchn + 1 
     if word != letter:   
      targetn = targetn + 1 
    if (searchn + 1) == len(searchn): 
     return True 
    else: 
     return False 

print search_in_string(y, x) 

在Python中運行代碼時,我得到索引錯誤,因爲searchn超出範圍。我將不勝感激:

  1. 這是什麼問題的代碼和;
  2. 我對indentations和while循環的理解是不完整的。
+2

您能否澄清一下這個函數應該做什麼?我認爲你的問題與邏輯有關,而不是縮進,但我不確定你要做什麼。 (我最好的猜測是,當且僅當'target'是'search'的子串時,它應該返回'True'。) – zwol

+0

對我來說,你的縮進看起來很好。我完全同意Zack的看法,你的邏輯看起來有點偏離。但是我們不知道這個功能應該做什麼。預期的投入和產出是什麼? – aIKid

+0

謝謝,我做了編輯澄清 - 是的,代碼應該在最後返回True或False。 – user3081750

回答

0

無法進入代碼的邏輯。

編輯:好的,在if後衛的意圖中有錯誤。然而,零長度參數也是一個問題。

x = "I am a horse." 
y = "a r" 

def search_in_string(search, target): 
    targetn = 0 
    searchn = 0 
    while (targetn + 1) != len(target): 
     letter = target[targetn] 
     word = search[searchn] 
     if word == letter: 
      targetn = targetn + 1 
      searchn = searchn + 1 
     if word != letter:   
      targetn = targetn + 1 
    #This will get executed AFTER the WHILE loop 
    if (searchn + 1) == len(search): 
     return True 
    else: 
     return False 

print(search_in_string(x,y)) 

工作代碼:

def search_in_string(search, target): 
    targetn = 0 
    searchn = 0 
    while (targetn + 1) != len(target): 
     letter = target[targetn] 
     word = search[searchn] 
     if word == letter: 
      targetn = targetn + 1 
      searchn = searchn + 1 
     if word != letter:   
      targetn = targetn + 1 
     #This will get executed WITHIN the WHILE loop 
     if (searchn + 1) == len(search): 
      return True 
     else: 
      return False 
0

我覺得這是寫你的功能更簡單的方法

def search_in_string(search, target): 
    iter_t = iter(target) 
    return all(c in iter_t for c in search) 

如:

>>> search_in_string("a r", "I am a horse.") 
True 
>>> search_in_string("a re", "I am a horse.") 
True 
>>> search_in_string("a er", "I am a horse.") 
False 
1

1.什麼是錯的代碼

錯別字在12行:它應該是len(search)而不是len(searchn)

Off-by-one錯誤:if index == len(array)then it is off off end。在所有指數測試中刪除+ 1

第4行中的剩餘錯誤:在while條件下同時測試targetnsearchn。根據字符串中的數據,任何一個都可以首先結束。(活動最終searchn測試循環中,即luk32建議,還修復了這個漏洞,而不是爲特殊情況下,當搜索爲空或超過目標更長的時間。)

2.如果我的理解縮進和while循環不完整

不,但可能是列表和數組索引。

但更重要的,功能的命名和變量都不是很清楚,而且代碼的風格看起來非常像C.

命名

在當前的代碼(與bug修復)試試這個:

  • 變化的函數名search_in_stringis_subsequence
  • 變化的變量名searchpartial
  • 變化的變量名targetfull
  • 同樣改變索引變量ipartifull或類似
  • 除去變量letterword完全
  • full[ifull]word與在測試中partial[ipart]替換letter

現在不清楚了嗎?

在這裏,我也換成了互補的第二if試驗明顯帶有else

def is_subsequence(partial, full): 
    ifull = 0 
    ipart = 0 
    while ifull != len(full) and ipart != len(partial): 
     if partial[ipart] == full[ifull]: 
      ifull = ifull + 1 
      ipart = ipart + 1 
     else: 
      ifull = ifull + 1 
    if ipart == len(partial): 
     return True 
    else: 
     return False 

風格

節目風格看起來仍然像C與陣列,顯式循環,並精心操作索引。您有機會了解一種稱爲「pythonic」的編碼風格。請參閱https://stackoverflow.com/questions/58968/what-defines-pythonian-or-pythonic及其中的一些鏈接。

我想說gnibbler的答案是pythonic,但如果你不知道迭代器和列表理解,可能很難理解。這是另一個有點pythonic解決方案,我希望有一點容易閱讀。但是,您需要了解陣列切片。

def is_subsequence(partial,full): 
    for char in full: 
     if partial.startswith(char): 
      partial = partial[1:] 
    return len(partial) == 0 
相關問題