2012-09-02 62 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