iT邦幫忙

2025 iThome 鐵人賽

DAY 9
0
AI & Data

Rosalind 生物資訊解題系統系列 第 9

Day09 | Rosalind 生資解題 - 002. RNA(Transcribing DNA into RNA )+字串轉換

  • 分享至 

  • xImage
  •  

Day09 | Rosalind 生資解題 - 002. RNA(Transcribing DNA into RNA )+字串轉換

題目連結:https://rosalind.info/problems/rna/

https://ithelp.ithome.com.tw/upload/images/20250920/20125192z0ZE5wnhyl.png

給一段DNA序列,要轉成RNA序列

其中,DNA在轉錄(transcription, 抄錄)成RNA時,ATCG會被抄寫成AUCG

(DNA to RNA)
A    =>    A
T    =>    U
C    =>    C
G    =>    G

抄寫的過程仰賴RNA聚合酶(RNA polymerase),他是把DNA拷貝成RNA的抄寫機,只是抄寫機的鍵盤上沒有T這個按鍵,於是拿U來代替。

不過要注意:DNA是雙股螺旋;RNA是單股的沒有固定形狀、比較脆弱
(雖然此處知識點跟題目無關就是了 xd)

DNA(Deoxyribonucleic acid, 去氧核糖核酸)是雙股螺旋A-T、C-G,左右形成兩兩一對,結構穩定。
RNA(Ribonucleic acid, 核糖核酸)是單股不規則形狀(不是單股螺旋),會自己跟自己形成鍵結而成特殊形狀,未來有機會再詳談。RNA只有單股,所以結構相對不穩定,容易被降解。

https://ithelp.ithome.com.tw/upload/images/20250920/20125192F09P4ku45i.png

輸入:

GATGGAACTTGACTACGTAAATT

輸出:

GAUGGAACUUGACUACGUAAAUU

程式作法有非常多種,可以直接疊代一次轉換
程式碼:

s = "GATGGAACTTGACTACGTAAATT"

for base in s:
    match base:
        case 'T':
            print('U', end='')
        case _:
            print(base, end='')

# for base in s:
#    print('U' if base == 'T' else base, end='')

或者,使用正規表達式

import re

s = "GATGGAACTTGACTACGTAAATT"
rna = re.sub('T', 'U', s) # 替換(substitute)

print(rna)

或者,用字串取代

s = "GATGGAACTTGACTACGTAAATT"

# print(s.replace('T', 'U'))

def transcribe_dna_to_rna(dna):
    return dna.replace('T', 'U')

print(transcribe_dna_to_rna(s))

str.replace() 一次只能處理一種字串/字元

或者,使用str.translate() 則可處理多種字串/字元
建立轉換表

s = "GATGGAACTTGACTACGTAAATT"

trans_table = str.maketrans('T', 'U')
rna = s.translate(trans_table)

print(rna)

str.translate() 的幾種用法:

str.maketrans(參數一, [[參數二], 參數三])

至少要填入第一個參數
至於參數二、參數三則是可選的

1:只傳入一個參數:使用字典

傳入一個字典,但此字典的key只能是字元(字串的長度只能是1)

table = str.maketrans({
    'a': 'alpha',
    'b': 'bet',
    'c': '',  # 代表刪除'c'
    '!': '!',
    # '!!': '!!!' # 這行會出錯,key只能是字元
})

s = "abc!"

print(s.translate(table))  # alphabet!
print("I b U!!".translate(table)) # I bet U!!

2:傳入兩個參數:兩個等長字串

傳入字串的話,就是一個字元對另一個字元的取代
限制比較多,能做的轉換比方法一還少
傳入的兩個字串(參數一、參數二)必須等長

  • 參數一:要被替換的原字元
  • 參數二:要換成的新字元
table = str.maketrans(',.!', ',。!') # 字符全形轉換

s = "今天,天氣真好.啊!忽然下雨了..."

print(s.translate(table)) # 今天,天氣真好。啊!忽然下雨了。。。

3:傳入三個參數:方法二+刪除字元

  • 參數一:要被替換的原字元
  • 參數二:要換成的新字元
  • 參數三:要刪除的字元

只刪除特定字元

table = str.maketrans('', '', ',.!') # 不執行取代,而是把所有標點符號去除

s = "今天,天氣真好.啊!忽然下雨了..."

print(s.translate(table)) # 今天天氣真好啊忽然下雨了

取代並刪除字元

table = str.maketrans('真', '不', ',.!') # 天氣:真好 => 不好

s = "今天,天氣真好.啊!忽然下雨了..."

print(s.translate(table)) # 今天天氣不好啊忽然下雨了

取代並刪除字元(可以觀察到,是先做完取代,然後再刪除字元)

table = str.maketrans(',.!', ',。!','.') # 字符全形轉換,最後再刪除句號

s = "今天,天氣真好.啊!忽然下雨了..."

print(s.translate(table)) # 今天,天氣真好啊!忽然下雨了

上一篇
Day08 | Rosalind 生資解題 - 001. DNA(Counting DNA Nucleotides)
下一篇
Day10 | Rosalind 生資解題 - 003. REVC (Complementing a Strand of DNA)
系列文
Rosalind 生物資訊解題系統12
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言