2014-06-30 64 views
-1

下面的代碼不能如何工作,以獲得輸入字符的補碼?看起來循環不會結束,但如果我輸入'Z'作爲dna,爲什麼它不會中斷並退出?我是否使用了休息或者是否錯誤? elif怎麼樣?獲取字符的補充

高清get_complement(DNA):

''' (ch) -> ch 

Reverse the 'A' to 'T' or vice versa and 'C' to 'G' and vice versa too. 
>>> get_complement('A') 
'C' 
>>> get_complement('G') 
'T' 

''' 
if dna == 'A': 
    print ('C') 
    if dna == 'C': 
     print ('A') 
     if dna == 'T': 
      print ('G') 
      if dna == 'G' : 
       print ('T') 
       while {'A', 'C', 'G', 'T'}.isnotsubset(set(dna)) : 
        break 
       return ('') 
+1

就像你寫的例子一樣(而且Cyber​​已經根據你的例子寫了他的答案),你沒有得到補充。它們被設置爲使得A-> C(而不是補碼T),T - > G而不是A等。 使用字典作爲Cyber​​已完成,它應該看起來像這樣: complement = {' A':'T','T':'A','C':'G','G':'C'} – iayork

回答

2

您應該建立一個地圖,使用dictionary

complement = {'A': 'C', 'C': 'A', 'T': 'G', 'G': 'T'} 

那麼對於一些字符串,你可以做

original = "ATCGTCA" 
"".join(complement[letter] for letter in original) 

輸出

'CGATGAC' 

對於只是一個單一的字符:

complement['A'] 

輸出

'C' 
+0

我在恭維中代表什麼?爲什麼一個空列表正在加入? (我對字典並不熟悉) – MingJian

+0

'i'只是當前元素,它是一個臨時變量。如果閱讀更有意義,我將它改爲'letter'。行'「」.join()'接受該循環的輸出,它將成爲一個列表,並創建一個單獨的字符串而不是一個字符列表。 – CoryKramer

0

當你的例子寫(和網絡寫根據您的例子他的回答)你沒有得到補充。你得到一個 - > C(而不是補T),T - 「G代替A等

使用字典作爲網絡已經完成,它應該是這樣的:

complement = {'A':'T', 'T':'A', 'C':'G', 'G':'C'} 

而在代碼,包括非DNA字符的檢查:

original = "ATCGTCA" 
bad_original = "ATCGTCAZ" 

complement = {'A':'T', 'T':'A', 'C':'G', 'G':'C'} 
for dna in (original, bad_original): 
    try: 
     output = "".join([complement[x] for x in dna]) 
    except KeyError: 
     output = "Contains non-DNA characters" 

    print output 

其中,「原」產量「TAGCAGT」和「bad_original」收益「包含非DNA字符」。

請注意,這是補充,而不是反向補充,通常更感興趣。更一般地說,如果你打算使用這個序列的DNA,你應該看看BioPython模塊(http://biopython.org/wiki/Seq#Complement_and_reverse_complement),它會讓你補充(和反向補充)更多的功能,錯誤檢查等。

+0

爲什麼下面的代碼沒有返回值? (因爲它在我進入它之後進入新行 - get_complement('ACGTAC')而沒有任何返回。) complement = {'A':'C','C':'A','T':'如果len(dna)> 0: 輸出{'A','T','C','G'}。issubset(set(dna)): 輸出:G','G':'T'} 輸出=「」。加入(對dna中字母的補碼(字母)) else: ({'A','T','C','G'}!= subset(set(dna))) ouput ='Non-DNA字符!' break return print(輸出) – MingJian

+0

我不能確切地告訴你在這裏做什麼;請格式化您的代碼。我看到一些問題: (1)你有一個輸入錯誤,輸出爲「輸出」 (2)我不知道你想在「其他」塊中做什麼,但我確定這不是你想要做的。你想檢查那裏的非DNA字符嗎?那裏是否應該有「如果」?在任何情況下,它嵌套在「while」子句中,不應該允許它成爲真 (3)while子句也不能檢查你的DNA字符是否正確 (4)你仍然沒有正確的補充。 「C」不是「A」的補碼,等等。 – iayork

+0

'complement = {'A':'T','T':'A','C':'G','G':'C'} ('d'):' '如果len(dna)> 0:' 'output =「」.join(complement ('''''','C','G'}!= subset(set(dna))):' 'output ='非DNA字符發現'' 'break' 'return print(output)' – MingJian