2014-03-03 57 views
1

這個程序應該找到一個字符串在什麼地方開始(在「ATG」)並切片直到結束點(在「TAG」,「TAA」或「TGA」)。每當我嘗試使用我創建的函數和提供的測試字符串計算lastIndex時,我連續收到-1作爲索引。是否有Python函數拋出或忽略負值?是否有一個拋棄或忽略負值的Python函數?

genome = 'TTATGTTTTAAGGATGGGGCGTTAGTT' 
newGenome = '' 

def firstIndex(genome): 
    return genome.find("ATG") 

def lastIndex(genome): 
    return min(genome.find("TAG"), genome.find("TAA"), genome.find("TGA")) 


for i in range(genome.count("ATG")): 
    newgenome = genome[firstIndex(genome):lastIndex(genome)] 
+0

我懷疑一個正則表達式會比較好,例如('ATG。*?(?: TAG | TAA | TGA)',基因組):print s.group(0)'會打印ATGTTTTAA和ATGGGGCGTTAG。 –

回答

2

find如果找不到任何東西,則返回-1。因此,如果密碼子的任何未找到,您的lastIndex函數將始終返回-1。

你並不是真的想要「忽略-1」,你想要找到TAG|TAA|TGA的第一個實例。 (幸好你提供你的代碼,所以我們躲開了XY problem最糟糕的部分)

你的代碼也從沒有效率受到影響 - 它使整整3穿過整個字符串,只是爲了找到的三個密碼子之一的第一次出現。我們可以通過使用正則表達式來改善它。

嘗試使用re.finditer,所以你只需要做出一個通過你的基因組:

next(m.start() for m in re.finditer('TAG|TAA|TGA',genome)) 
Out[9]: 8 

使用next是好的,因爲我們可以提供一個默認值,如果沒有從發電機表達產生:

def lastIndex(genome): 
    return next((m.start() for m in re.finditer('TAG|TAA|TGA',genome)),None) 
+0

通過使用迭代器,'lastIndex'函數只進行一次遍歷 - 但整個程序仍然進行兩遍。您可以通過利用「ATG」和「TAG | TAA | TGA」替代方案(即前者只需從字符串的開頭或「TAG | TAA | TGA」的最後一個出現處搜索)來避免一次傳遞,而前者只需要從'ATG'的最後一次出現開始搜索。 –

+0

你是對的 - 我沒有嘗試去優化整個OP的程序。在現實生活中,嚴格的一次通過可能不會更快,因爲起始密碼子通常接近字符串的開始,所以'find'或多或少是一個常數時間。 – roippi

+0

雖然經過反思,看起來所有的OP都試圖做的是提取開始和終止密碼子之間的東西 - 他並不真正關心指數。因此,用正則表達式替換他的整個代碼可能是合理的,因爲它更簡單。 – roippi

1

不知道這忽略了負值的功能就足夠了這裏,因爲你將不得不相應地改變你的for循環。達到的效果的一種方法是修改代碼爲:

def lastIndex(genome): 
    val = min(genome.find("TAG"), genome.find("TAA"), genome.find("TGA")) 
    return val if val > -1 else None 


for i in range(genome.count("ATG")): 
    li = lastIndex(genome) 
    if li: 
     newgenome = genome[firstIndex(genome):li] 
    else: 
     newgenome = genome[firstIndex(genome):] 

編輯:我的回答是針對提供一種方法,忽略你的lastIndex方法的返回值爲負,並在隨後的for循環相應處理它不管你如何計算實際返回值的邏輯。然而,正如@roippi指出的,你計算lastIndex的回報值的方式存在缺陷,他的回答解決了這個問題。

+0

這是錯誤的。在包含'TAG'但不包含'TAA'或'TGA'的字符串中,'lastIndex'將*返回'None',因爲這三個'find'操作的'min'將爲-1。 – roippi

+0

在這種情況下,OP的原始代碼也是錯誤的?我只是重新組織他的代碼以適應他期望的回報價值。我的建議並沒有改變最初的預期邏輯。 – shaktimaan

+0

是的,這裏的重點在於OP的邏輯是錯誤的。 – roippi

相關問題