我有一个 DNA 序列,想使用 Python 获得它的反向互补序列。它位于 CSV 文件的其中一列中,我想将反向补码写入同一文件中的另一列。棘手的部分是,有一些单元格包含 A、T、G 和 C 以外的内容。我能够用这段代码获得反向补码:
def complement(seq):
complement = {'A': 'T', 'C': 'G', 'G': 'C', 'T': 'A'}
bases = list(seq)
bases = [complement[base] for base in bases]
return ''.join(bases)
def reverse_complement(s):
return complement(s[::-1])
print "Reverse Complement:"
print(reverse_complement("TCGGGCCC"))
但是,当我尝试查找补码字典中不存在的项目时,使用下面的代码,我只得到最后一个碱基的补码。它不迭代。我想知道如何解决它。
def complement(seq):
complement = {'A': 'T', 'C': 'G', 'G': 'C', 'T': 'A'}
bases = list(seq)
for element in bases:
if element not in complement:
print element
letters = [complement[base] for base in element]
return ''.join(letters)
def reverse_complement(seq):
return complement(seq[::-1])
print "Reverse Complement:"
print(reverse_complement("TCGGGCCCCX"))
其他答案完全没问题,但如果你打算处理真实的 DNA 序列,我建议使用 Biopython。如果遇到“-”、“*”或不定义等字符怎么办?如果您想对序列进行进一步操作怎么办?您想为每种文件格式创建一个解析器吗?
您要求的代码很简单:
from Bio.Seq import Seq
seq = Seq("TCGGGCCC")
print seq.reverse_complement()
# GGGCCCGA
现在如果你想做另一个转变:
print seq.complement()
print seq.transcribe()
print seq.translate()
输出
AGCCCGGG
UCGGGCCC
SG
如果您遇到奇怪的字符,无需继续向程序中添加代码。 Biopython 处理它:
seq = Seq("TCGGGCCCX")
print seq.reverse_complement()
# XGGGCCCGA
一般来说,生成器表达式比原始代码更简单,并且避免创建额外的列表对象。如果可以插入多个字符,请选择其他答案。
complement = {'A': 'T', 'C': 'G', 'G': 'C', 'T': 'A'}
seq = "TCGGGCCC"
reverse_complement = "".join(complement.get(base, base) for base in reversed(seq))
import string
old_chars = "ACGT"
replace_chars = "TGCA"
tab = string.maketrans(old_chars,replace_chars)
print "AAAACCCGGT".translate(tab)[::-1]
这会给你相反的赞美= ACCGGGTTTT
字典的
get
方法允许您在字典中没有键的情况下指定默认值。作为预处理步骤,我会将所有非“ATGC”碱基映射到单个字母(或标点符号、数字或序列中不会出现的任何内容),然后反转序列,然后将单个字母替换为原始字母。或者,您可以先将其反转,然后搜索并将 sni
等内容替换为 ins
。
alt_map = {'ins':'0'}
complement = {'A': 'T', 'C': 'G', 'G': 'C', 'T': 'A'}
def reverse_complement(seq):
for k,v in alt_map.iteritems():
seq = seq.replace(k,v)
bases = list(seq)
bases = reversed([complement.get(base,base) for base in bases])
bases = ''.join(bases)
for k,v in alt_map.iteritems():
bases = bases.replace(v,k)
return bases
>>> seq = "TCGGinsGCCC"
>>> print "Reverse Complement:"
>>> print(reverse_complement(seq))
GGGCinsCCGA
反向补码最快的一个班轮如下:
def rev_compl(st):
nn = {'A': 'T', 'C': 'G', 'G': 'C', 'T': 'A'}
return "".join(nn[n] for n in reversed(st))
def ReverseComplement(Pattern):
revcomp = []
x = len(Pattern)
for i in Pattern:
x = x - 1
revcomp.append(Pattern[x])
return ''.join(revcomp)
# this if for the compliment
def compliment(Nucleotide):
comp = []
for i in Nucleotide:
if i == "T":
comp.append("A")
if i == "A":
comp.append("T")
if i == "G":
comp.append("C")
if i == "C":
comp.append("G")
return ''.join(comp)
尝试一下下面的代码,
complement = {'A': 'T', 'C': 'G', 'G': 'C', 'T': 'A'}
seq = "TCGGGCCC"
reverse_complement = "".join(complement.get(base, base) for base in reversed(seq))
还考虑简并碱基:
def rev_compl(seq):
BASES ='NRWSMBDACGTHVKSWY'
return ''.join([BASES[-j] for j in [BASES.index(i) for i in seq][::-1]])
这可能是完成反向恭维的最快方式:
def complement(seq):
complementary = { 'A':'T', 'T':'A', 'G':'C','C':'G' }
return ''.join(reversed([complementary[i] for i in seq]))
使用
timeit
模块进行速度分析,这是我与同事一起提出的最快的序列算法 < 200 nucs:
sequence \
.replace('A', '*') \ # Temporary symbol
.replace('T', 'A') \
.replace('*', 'T') \
.replace('C', '&') \ # Temporary symbol
.replace('G', 'C') \
.replace('&', 'G')[::-1]