這是關於一個更有效的代碼設計的一個問題:改進代碼設計
假設三個對準的DNA序列(SEQ1,SEQ2和SEQ3;它們各自的字符串),其表示兩個基因(基因1和基因2 )。這些基因的起始和終止位置相對於比對的DNA序列是已知的。
# Input
align = {"seq1":"ATGCATGC", # In seq1, gene1 and gene2 are of equal length
"seq2":"AT----GC",
"seq3":"A--CA--C"}
annos = {"seq1":{"gene1":[0,3], "gene2":[4,7]},
"seq2":{"gene1":[0,3], "gene2":[4,7]},
"seq3":{"gene1":[0,3], "gene2":[4,7]}}
我希望刪除從對準的間隙(即,短劃線)和保持的開始的相對關聯和停止的基因的位置。
# Desired output
align = {"seq1":"ATGCATGC",
"seq2":"ATGC",
"seq3":"ACAC"}
annos = {"seq1":{"gene1":[0,3], "gene2":[4,7]},
"seq2":{"gene1":[0,1], "gene2":[2,3]},
"seq3":{"gene1":[0,1], "gene2":[2,3]}}
獲得所需的輸出不像看起來那麼微不足道。下面我寫了一些(行編號)僞代碼對於這個問題,但肯定有一個更優雅的設計。
1 measure length of any aligned gene # take any seq, since all seqs aligned
2 list_lengths = list of gene lengths # order is important
3 for seq in alignment
4 outseq = ""
5 for each num in range(0, length(seq)) # weird for-loop is intentional
6 if seq[num] == "-"
7 current_gene = gene whose start/stop positions include num
8 subtract 1 from length of current_gene
9 subtract 1 from lengths of all genes following current_gene in list_lengths
10 else
11 append seq[num] to outseq
12 append outseq to new variable
13 convert gene lengths into start/stop positions and append ordered to new variable
任何人都可以給我一個更短,更直接的代碼設計的建議/例子嗎?
尋找一個蟒蛇解決方案,這更好地被標記_python_ - 我會下降僞代碼。您已將數組從「1」重新設置爲1:考慮代表範圍/切片,包括_ [from,to] _排除。 _anno_和_align_通過「標籤」的「關聯」看起來很輕微。 - 您需要指定_genes_之間允許的重疊或間隔(如果有)。保持_annos_中的_genes_應該有所幫助 - 指定! 8&9可能太詳細了。受過教育的猜測:取決於代表性,13大約是複雜性的一半 - 擴大。 (一旦你得到了代碼_and_仍然可以看到問題,可以考慮在CODE REVIEW上提出這個問題。) – greybeard
@greybeard我按照你的建議改變了標籤。根據你的建議(特別是第13行),僞代碼的變化即將出現。 –
只是爲了澄清,這是你的數據是什麼意思?對於序列「AT ---- GC」,「gene1」:[0,3],「gene2」:[4,7]表示gene1爲AT - ,可縮寫爲AT ',而gene2是' - GC',可以縮寫爲'GC'? – Pausbrak