【ROSALIND】【練Python,學(xué)生信】72 從譜圖推測多肽

如果第一次閱讀本系列文檔請(qǐng)先移步閱讀【ROSALIND】【練Python,學(xué)生信】00 寫在前面 ?謝謝配合~

題目:
從譜圖推測多肽(Using the Spectrum Graph to Infer Peptides)
?
Given: A list L (of length at most 100) containing positive real numbers.
所給:不超過100個(gè)正實(shí)數(shù)的列表L。
Return: The longest protein string that matches the spectrum graph of L (if multiple solutions exist, you may output any one of them).
需得:根據(jù)L能得到的最長蛋白序列(如果有多個(gè)結(jié)果,只返回任意一個(gè)即可)。
?
測試數(shù)據(jù)
3524.8542
3623.5245
3710.9335
3841.974
3929.00603
3970.0326
4026.05879
4057.0646
4083.08025
測試輸出
WMSPG
?
生物學(xué)背景
? ? ? ?在58 從全譜推測多肽序列中,我們假設(shè)每種b離子和y離子都可以存在。但在實(shí)際情況中,并非每一種斷裂方式都會(huì)出現(xiàn),且往往具有誤差。因此,很難從單一的質(zhì)譜結(jié)果中得到完整的多肽。我們需要從實(shí)驗(yàn)結(jié)果中推斷出盡量長的多肽序列。
?
思路
? ? ? ?很不幸,這題我沒有看懂,在網(wǎng)上搜索大神的代碼(ttps://github.com/fedeoliv/Rosalind-Problems/blob/master/sgra.py)并運(yùn)行后,我才大致弄明白解答思路。讓我們以題目所給數(shù)據(jù)為示例,來用畫圖的方法理解一下解題思路。
? ? ? ?首先,題目給了由9個(gè)實(shí)數(shù)組成的列表L,且從小到大排列,我們用下圖來表示:
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

? ? ? ?本題的最終目的就是從這9個(gè)數(shù)中得到最長的多肽,為了實(shí)現(xiàn)這個(gè)目的,大神從后往前遍歷這個(gè)列表,方法是用一個(gè)數(shù)后面的每個(gè)數(shù)依次減這個(gè)數(shù),假如差值對(duì)應(yīng)了一個(gè)氨基酸,且能使現(xiàn)有序列最長,就保留。不懂?我們來用圖看一下。
? ? ? ?從最后一個(gè)數(shù)開始,當(dāng)用第9個(gè)數(shù)減去第7個(gè)數(shù)時(shí),我們第一次得到了一個(gè)對(duì)應(yīng)氨基酸的差值,我們可以在第7個(gè)數(shù)下面標(biāo)記“G”,記錄下此時(shí)的多肽序列。如下圖。

? ? ? ?繼續(xù)向前遍歷,當(dāng)用第8個(gè)數(shù)減去第6個(gè)數(shù)時(shí),我們又得到了一個(gè)對(duì)應(yīng)氨基酸的差值,我們可以在第6個(gè)數(shù)下面標(biāo)記“S”。如下圖。

? ? ? ?繼續(xù),當(dāng)被減數(shù)是第5個(gè)數(shù)時(shí),出現(xiàn)了兩種情況。既可以用第7個(gè)數(shù)減去第5個(gè)數(shù),也可以用第8個(gè)數(shù)減去第5個(gè)數(shù)。但我們只選擇前者,為什么?因?yàn)榍罢呖梢宰岆亩蔚拈L度變成2(“PG”)。如下圖。

? ? ? ?重復(fù)上述過程,你會(huì)發(fā)現(xiàn)上面的這條路徑會(huì)一騎絕塵,超越所有其他情況的長度,最終我們得到了最長的序列“WMSPG”。

? ? ? ?理解了思路之后,再看大神的代碼就很簡單了,因此代碼部分就不再給注釋啦。
?
代碼