首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用Python反向补充DNA链

用Python反向补充DNA链
EN

Stack Overflow用户
提问于 2014-08-07 17:50:45
回答 9查看 83.7K关注 0票数 13

我有一个DNA序列,希望用Python得到它的反向补充。它位于CSV文件的一个列中,我想在同一个文件中编写另一个列的反向补语。最棘手的部分是,除了A、T、G和C之外,还有几个单元格可以用这段代码进行反向补码:

代码语言:javascript
复制
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"))

然而,当我试图找到补语字典中不存在的项目时,使用下面的代码,我只得到最后一个基的补语。它不会迭代。我想知道怎样才能修好它。

代码语言:javascript
复制
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"))
EN

回答 9

Stack Overflow用户

回答已采纳

发布于 2014-08-07 17:57:05

字典的get方法允许您指定一个默认值,如果键不在字典中。作为预处理步骤,我会将所有非ATGC基映射到单个字母(或标点符号或数字或任何不会出现在序列中的内容),然后反转顺序,然后用原始字母替换单个字母。或者,您可以先将其反转,然后搜索并用sni替换为ins

代码语言:javascript
复制
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
票数 5
EN

Stack Overflow用户

发布于 2014-08-07 18:16:38

其他的答案是非常好的,但如果你计划处理真实的DNA序列,我建议使用Biopython。如果你遇到一个像"-","*“这样的角色,或者没有定义呢?如果你想对你的序列做进一步的操作呢?您想要为每个文件格式创建解析器吗?

您所要求的代码非常简单,就像:

代码语言:javascript
复制
from Bio.Seq import Seq

seq = Seq("TCGGGCCC")

print seq.reverse_complement()
# GGGCCCGA

现在,如果您想要执行另一个转换:

代码语言:javascript
复制
print seq.complement()
print seq.transcribe()
print seq.translate()

输出

代码语言:javascript
复制
AGCCCGGG
UCGGGCCC
SG

如果遇到奇怪的字符,就不需要继续向程序中添加代码。Biopython处理这个问题:

代码语言:javascript
复制
seq = Seq("TCGGGCCCX")
print seq.reverse_complement()
# XGGGCCCGA
票数 38
EN

Stack Overflow用户

发布于 2014-08-07 18:04:43

通常,生成器表达式比原始代码更简单,并且避免创建额外的列表对象。如果可以有多个字符插入,请与其他答案一起使用。

代码语言:javascript
复制
complement = {'A': 'T', 'C': 'G', 'G': 'C', 'T': 'A'}
seq = "TCGGGCCC"
reverse_complement = "".join(complement.get(base, base) for base in reversed(seq))
票数 20
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25188968

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档