这一题来自Rosalind
求DNA序列的反向互补序列
![](https://img.haomeiwen.com/i5011192/2c04a6416397e422.png)
想到的方法是将每行序列读入到字符串,再逐个判断,如果是A就换成T,如果是T就换成A,G就换成C,C就换成G,然后打印反向序列
于是,写了如下的脚本:
![](https://img.haomeiwen.com/i5011192/acda3614a35758f1.png)
这个脚本运行是没有问题的,如下:
![](https://img.haomeiwen.com/i5011192/d9c8d35734ae4507.png)
写脚本的过程中遇到几个问题:
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值存入列表即可,
![](https://img.haomeiwen.com/i5011192/0a222bddf39a2591.png)
可见,代码少了很多行。需要注意和记住的一种写法traslineL=[transDict[i] for i in lineL],这种将某个列表遍历,并将每个元素转换成字典的值存入列表。这种方式在《生信第一题》中也提到过
![](https://img.haomeiwen.com/i5011192/7f65028931960807.png)
可以写成
![](https://img.haomeiwen.com/i5011192/c280adf90d296257.png)
当然,对列表中加元素的原始方法是先建一个空列表,然后利用list.append()追加,注意这个函数是不返回值的,和list.reverse()很像。这种方法,我写了一个例子:
![](https://img.haomeiwen.com/i5011192/f5710fe365f76c3d.png)
最后,关于此题我在生信技能数上看到一种特别简单的方法,有关于maketrans的方法,另外还有个知识点:
切片操作[::-1],从头到尾,步长是-1,切,得到反向序列
![](https://img.haomeiwen.com/i5011192/e1846c677ddf1389.png)
对字符串取反向就用这个,列表取反向就用list.reverse()
以上。
网友评论