2012-09-02 88 views
-1

我正在編寫一個程序,在該程序中我可以反轉序列並全部替換爲Ts,所有Cs都帶有Gs,所有帶有Cs的Gs以及所有Ts都帶有As。該程序將讀取一系列鹼基並輸出反向互補序列。我無法做到這一點所以任何人都請爲我的代碼來看看幫助我:Python結構錯誤

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 

問候

回答

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 stat但上面的代碼避免了需要循環每個字母,決定它應該變成什麼,然後合併結果。這樣每個字母只能被轉換一次。

編輯:哎呀,我沒有注意到你也想扭轉字符串。固定。

+0

在您的代碼中,此錯誤即將出現! :追溯(最近一次調用最後一次): 文件「C:\ Python26 \ python code \ week 4 \ Q9」,第3行,在 newword =''.join(swap_dict [letter] ) 文件「C:\ Python26 \ python code \ week 4 \ Q9」,第3行,在 newword =''.join(swap_dict [字母]爲反向(字)字母) KeyError:'S' – jaddy123

+0

啊。 'KeyError'說S不在交換字典中,所以它不知道如何處理它。你想在字母S上發生什麼? – DSM

1

所以,如果我明白你想要做什麼,你想交換所有的Ts和As以及交換所有的Gs和Cs 你想扭轉字符串。

好的,首先,讓我們開始反轉字符串,這是你沒有實現的。不幸的是,沒有明顯的方法可以做到,但this SO question about how to reverse strings in python應該給你一些想法。最好的解決方案似乎是

reversedWord = word[::-1] 

接下來,您需要交換字母。你不能在同一個字符串上調用replace("T", "A")replace("A","T"),因爲這會使你和As都被設置爲T.你似乎已經認識到這一點,但是你爲每個交換使用不同的字符串,並且不要將它們合併。相反,您需要一次一個字母地檢查字符串,然後檢查。事情是這樣的:

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使用字典來快速簡單地返回正確的字母。也崩潰成一條線)

之所以你的國家因爲==的意思是「相等」,並且如果a等於word且b等於word,那麼ent不起作用的是你基本上說「如果a,b,c,d和word都完全相同」那麼a必須等於b。這隻有在字符串沒有As,Ts,Cs或Gs(即單詞不交換)的情況下才是真實的,所以你永遠不會輸出輸出。

+0

沒有@acattle它不工作 – jaddy123

+0

我寫這樣的代碼:字的raw_input =(「輸入序列 」) swappedWord = 「」 字 字母: 如果信== 「A」: swappedWord + =「 T」 ELIF信== 「T」: swappedWord + = 「A」 ELIF信== 「C」: 其他: swappedWord + =信 打印 「反向互補序列」,字 – jaddy123

+0

你的代碼是給該輸出:輸入序列:CGGTGATGCAAGG 反向互補序列:CGGTGATGCAAGG 反向互補序列:CGGTGATGCAAGG 反向互補序列:CGGT GATGCAAGG 反向互補序列:CGGTGATGCAAGG 反向互補序列:CGGTGATGCAAGG 反向互補序列:CGGTGATGCAAGG 反向互補序列:CGGTGATGCAAGG 反向互補序列:CGGTGATGCAAGG 反向互補序列:CGGTGATGCAAGG 反向互補序列:CGGTGATGCAAGG 反向互補序列:CGGTGATGCAAGG – jaddy123

3

您寫的代碼有問題,因爲步驟1和4彼此相反。因此,他們不能完全分開的步驟完成:將所有As轉換爲Ts,然後將這些(加上原始的Ts)轉換爲步驟4中的As。

對於一些簡單的,內置的,而─hopefully-高效的,我會考慮使用從字符串模塊轉換表:

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' 
+0

步驟#1和#4實際上*不是彼此的對立面。我首先想到的是,但是#1的LHS是'a',#4的LHS是'd',所以實際上沒有進行雙重轉換。 – DSM

+0

啊,你是對的 - 很好的電話。原始單詞不被修改,而是每個單獨替換的結果都存儲在一個單獨的變量中。我不確定爲什麼選擇這個設計,但是我發現有4個獨立的變量,每個變量都包含一些非常長的序列的修改,可能會導致內存使用問題。 – abought