-1

シーケンスを逆にして、すべてのAsをTに、すべてのCをGに、すべてのGをCに、すべてのTをAsに置き換えることができるプログラムを作成しています。プログラムは、塩基のシーケンスを読み取り、逆相補シーケンスを出力します。私はそれをするのに苦労しているので、誰かが私のコードを見てこれを手伝ってくれるでしょうか:

word = raw_input("Enter sequence: ")
a = word.replace('A', 'T')
b = word.replace('C', 'G')
c = word.replace('G', 'C')
d = word.replace('T', 'A')
if a == word and b == word and c == word and d == word:
    print "Reverse complement sequence: ", word

そして、私はこの種の出力が欲しいです:

Enter sequence: CGGTGATGCAAGG
Reverse complement sequence: CCTTGCATCACCG

よろしく

4

3 に答える 3

5

私はおそらく次のようなことをします:

word = raw_input("Enter sequence:")

# build a dictionary to know what letter to switch to
swap_dict = {'A': 'T', 'T': 'A', 'C': 'G', 'G': 'C'}

# find out what each letter in the reversed word maps to and then join them
newword = ''.join(swap_dict[letter] for letter in reversed(word))

print "Reverse complement sequence:", newword

私はあなたのステートメントを完全には理解していませんifが、上記のコードは、各文字をループし、それがどうなるかを決定し、結果を組み合わせることによって、1つを必要としないようにします。そうすれば、各文字は1回だけ変換されます。

編集:おっと、あなたも文字列を逆にしたいことに気づきませんでした。修理済み。

于 2012-09-02T03:35:57.633 に答える
3

手順1と4は互いに反対であるため、記述されたコードには問題があります。したがって、これらを完全に別々の手順で実行することはできません。手順4で、すべてのAsをTに変換してから、それら(および元のT)をAsに変換します。

シンプルで、組み込みで、うまくいけば効率的なものについては、文字列モジュールの変換テーブルを使用することを検討します。

import string
sequence = "ATGCAATCG"
trans_table = string.maketrans( "ATGC" , "TACG")
new_seq = string.translate( sequence.upper() , trans_table )
print new_seq

これにより、必要な出力が得られます。

'TACGTTAGC'

ユーザーがすべての文字を大文字にすることを忘れることはないと思いますが、入力が期待される形式であることを確認することをお勧めします。したがって、sequence.upper()を使用します。翻訳テーブルに含まれていない変換を含む文字/ベースは影響を受けません。

>>> string.translate( "AEIOUTGC" , trans_table )
'TEIOUACG'

逆補数シーケンスは?これは、出力文字列のスライス表記を使用して、-1のステップで簡潔に行うことができます。

>>> new_seq[::-1]
'CGATTGCAT'
于 2012-09-02T03:46:05.323 に答える
1

したがって、私があなたのやりたいことを理解しているなら、あなたはすべてのTとAsを交換し、すべてのGとCを交換し文字列を逆にしたいのです。

さて、まず、実装していない文字列の反転に取り組みましょう。残念ながら、それを行う明確な方法はありませんが、Pythonで文字列を逆にする方法に関するこのSOの質問は、いくつかのアイデアを与えるはずです。最善の解決策は

reversedWord = word[::-1]

次に、文字を交換する必要があります。AsとTの両方がTに設定されるため、同じ文字列でを呼び出すことはできません。これを認識しているようですが、スワップごとに別々の文字列を使用し、それらを組み合わせることはありませreplace("T", "A") replace("A","T")代わりに、一度に1文字ずつ文字列を調べて、確認する必要があります。このようなもの:

swappedWord = "" #start swapped word empty
for letter in word: #for every letter in word
    if letter  == "A": #if the letter is "A"
        swappedWord += "T" #add a "T
    elif letter  == "T": #if it's "T"
        swappedWord += "A" #add an "A"
    elif letter  == "C": #if it's "C"
        ... #you get the idea

    else: #if it isn't one of the above letters
        swappedWord += letter #add the letter unchanged

編集-DSMの辞書ベースのソリューションは私のソリューションよりも優れています。私たちのソリューションは非常に似ていますが、両方の文字を見て、スワップされた文字がどうあるべきかを決定しますが、DSMのソリューションははるかにコンパクトです。 DSMのソリューションが何をしているのかについての一般的な考え方を理解するのに役立ちます。私の大きなifステートメントの代わりに、DSMは辞書を使用して適切な文字をすばやく簡単に返します。DSMもそれを1行にまとめました。)

ifステートメントが機能しない理由は、基本的に「a、b、c、d、および単語がすべてまったく同じである場合」と言っているためです。これは、==「等しい」という意味であり、aが単語およびbと等しい場合です。が単語に等しい場合、aはbに等しくなければなりません。これは、文字列にAs、Ts、Cs、またはGsがない場合(つまり、単語がスワップによって変更されない場合)にのみ当てはまるため、出力を出力することはありません。

于 2012-09-02T03:41:01.470 に答える