web-dev-qa-db-ja.com

Python

私はDNA配列を持っていますが、Pythonを使用してそれの逆補数を取得したいと考えています。それはCSVファイルの列の1つにあり、同じファイルの別の列に逆引きを書き込みたいのですが。トリッキーな部分は、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"))
7
user3783999

辞書のgetメソッドを使用すると、キーが辞書にない場合にデフォルト値を指定できます。前提条件の手順として、「ATGC」以外のすべての塩基を1文字(または句読点、数字、またはシーケンスに表示されないもの)にマッピングし、シーケンスを逆にして、1文字の代替を元の文字に置き換えます。または、最初に逆にしてから、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
3
Gabriel

他の答えはまったく問題ありませんが、実際の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
28
xbello

一般に、ジェネレータ式は元のコードよりも簡単で、余分なリストオブジェクトを作成する必要がありません。複数文字の挿入が可能な場合は、他の回答を使用してください。

complement = {'A': 'T', 'C': 'G', 'G': 'C', 'T': 'A'}
seq = "TCGGGCCC"
reverse_complement = "".join(complement.get(base, base) for base in reversed(seq))
15
Jason S
import string
old_chars = "ACGT"
replace_chars = "TGCA"
tab = string.maketrans(old_chars,replace_chars)
print "AAAACCCGGT".translate(tab)[::-1]

それはあなたに逆補数を与えるでしょう= ACC GGGTTTT

11
Nathan M
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)
0
niksy

以下のコードを試してください、

complement = {'A': 'T', 'C': 'G', 'G': 'C', 'T': 'A'}
seq = "TCGGGCCC"
reverse_complement = "".join(complement.get(base, base) for base in reversed(seq))
0
Akansha Rana

逆補数の最速のワンライナーは次のとおりです。

def rev_compl(st):
    nn = {'A': 'T', 'C': 'G', 'G': 'C', 'T': 'A'}
    return "".join(nn[n] for n in reversed(st))
0
alphahmed