生信(二)反向互补序列

时间:2024-03-30 07:37:34

关键词:reverse; complement; sequence;

**如何得到一段基因序列的反向互补序列?**这是基因测序领域经常遇到的问题。其实答案很简单,许多现成的软件都有这个功能。但是作为一个生信人,当然可以自己实现一个了。

首先想到的也是最基础的方法就是利用**多个if…else…**的语句进行判断选择。这种方法太笨拙,写出来的代码很不好看。今天我们分享几种好一点的方法。

Shell版本:tr命令和rev命令

生信(二)反向互补序列

Python版本:基于字典
代码如下:
生信(二)反向互补序列
这种方法简短优美,一目了然。与使用多个str.replace()函数相比其效率较高,因为上面的代码只需遍历原始字符串一次就够了,而多个str.replace()函数需要遍历字符串多次。

此外,上面的代码中字符串反向用到了一个Pythonic的写法:s[::-1]。更多Pythonic的句法可参考拙作《Python(一)让你的代码更加pythonic》。

C版本:基于数组
代码如下:
生信(二)反向互补序列
这种方法利用了字符的ascii码,即可以将字符映射为一个数字。而这个数字又可以转化为字符数组的序号(index),从而完成字符到字符的映射。C的版本是目前最快的!

值得注意的是,上面代码中的数组不光可以完成“AGCTN”这几种最常见碱基间的映射,还可以实现’B’与’V’、’D’与’H’、’R’与’Y’等简并碱基Degenerate bases)间的映射。该数组由lh3在seqtk中给出。

如果有任何问题欢迎交流!

(公众号:生信了)

生信(二)反向互补序列