【发布时间】:2016-01-15 17:23:33
【问题描述】:
这是一个关于更有效的代码设计的问题:
假设三个对齐的 DNA 序列(seq1、seq2 和 seq3;它们都是字符串)代表两个基因(gene1 和gene2)。这些基因的起始和终止位置相对于比对的 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
谁能给我建议/示例,让我设计更短、更直接的代码?
【问题讨论】:
-
寻找 Pythonian 解决方案,最好将其标记为 python - 我会放弃伪代码。您已经将数组从 1 重新“重新定位”到 0:考虑表示范围/切片,包括排除 [from, to)。 anno 和 align 通过“标签”的“关联”看起来很轻微。 - 您需要指定基因之间允许的重叠或间隙,如果有的话。在 annos 中保持 genes 有序应该会有所帮助 - 指定! 8&9 可能太详细了。有根据的猜测:根据表示,13 大约是您复杂性的一半 - 扩展。 (一旦您获得了代码并且仍然存在问题,请考虑在 CODE REVIEW 中展示此内容。)
-
@greybeard 我按照您的建议更改了标签。即将根据您的建议(尤其是第 13 行)更改伪代码。
-
澄清一下,这就是你的数据的意思吗?对于序列
AT----GC,"gene1":[0,3], "gene2":[4,7]表示gene1为AT--,可简写为AT,gene2为--GC,可简写为GC? -
后续问题,输入/输出格式是固定的还是只需要包含相同的数据?如果格式灵活,编写 Pythonic 解决方案会更容易。
-
@Pausbrak 关于您的第一个问题:是的,您对“缩短”(生物信息学家将其称为 degapping)的说明是正确的。关键是在这个去间隙步骤之后注释仍然是正确的。
标签: python algorithm optimization dna-sequence