这一题来自Rosalind
求DNA序列的反向互补序列
想到的方法是将每行序列读入到字符串,再逐个判断,如果是A就换成T,如果是T就换成A,G就换成C,C就换成G,然后打印反向序列
于是,写了如下的脚本:
这个脚本运行是没有问题的,如下:
写脚本的过程中遇到几个问题:
1.字符串里的单个字母或者其他是没有办法被赋值的,也就是说,想换掉字符串中的某个字母的话,需要将字符串先转换成列表,用到list(string),然后再赋值替换就可以了
2.python中if语句等都是要加冒号的,而awk命令则不需要。
3.python中应该是不支持i++这种写法,就用i+=1好了。
4.list.reverse()可以将列表元素反向排列
5.' '.join(list)可以将列表连成字符串
6.import sys
args=sys.argv
file =args[1] #这一行特别容易写错
我的脚本写的没问题,是可以运行的,但是一定有值得优化的地方
比如出现的4个判断语句就很累赘
所以考虑可以用字典的方式,
将待转换的碱基存为key,转换后的碱基存为value,构成一个字典。然后将原始序列转换成列表并取反向序列后,遍历列表并取字典的value值存入列表即可,
可见,代码少了很多行。需要注意和记住的一种写法traslineL=[transDict[i] for i in lineL],这种将某个列表遍历,并将每个元素转换成字典的值存入列表。这种方式在《生信第一题》中也提到过
可以写成
当然,对列表中加元素的原始方法是先建一个空列表,然后利用list.append()追加,注意这个函数是不返回值的,和list.reverse()很像。这种方法,我写了一个例子:
最后,关于此题我在生信技能数上看到一种特别简单的方法,有关于maketrans的方法,另外还有个知识点:
切片操作[::-1],从头到尾,步长是-1,切,得到反向序列
对字符串取反向就用这个,列表取反向就用list.reverse()
以上。
网友评论