-1

我正在编写一个程序,我可以在其中反转序列并将所有 As 替换为 Ts,将所有 Cs 替换为 Gs,将所有 Gs 替换为 Cs,并将所有 Ts 替换为 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说法,但上面的代码通过循环每个字母,决定它应该变成什么,然后组合结果来避免需要一个。这样每个字母只会被转换一次。

编辑:哎呀,我没有注意到你也想反转字符串。固定的。

于 2012-09-02T03:35:57.633 回答
3

您编写的代码有问题,因为步骤 1 和 4 彼此相反。因此它们不能在完全独立的步骤中完成:您将所有 As 转换为 T,然后在步骤 4 中将这些(加上原始 T)转换为 As。

对于一些简单的、内置的和-希望-高效的东西,我会考虑使用 string 模块中的翻译表:

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

因此,如果我了解您想要做什么,您想要交换所有 Ts 和 As 以及交换所有 Gs 和 Cs ,并且您想要反转字符串。

好的,首先,让我们来反转字符串,这是您尚未实现的。不幸的是,没有明显的方法可以做到这一点,但是这个关于如何在 python 中反转字符串的 SO question应该会给你一些想法。最好的解决方案似乎是

reversedWord = word[::-1]

接下来,您需要交换字母。您不能在同一个字符串上调用replace("T", "A") and replace("A","T"),因为这会使您的 As 和 Ts 都设置为 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 的更紧凑。但是,我仍然觉得我的解决方案是有助于帮助您了解 DSM 解决方案的总体思路。DSM 使用字典来快速简单地返回正确的字母,而不是我的大 if 语句。DSM 还将它折叠成一行。)

您的 if 语句不起作用的原因是您基本上是在说“如果 a、b、c、d 和 word 都完全相同”,因为==意味着“相等”并且如果 a 等于 word 和 b等于 word 那么 a 必须等于 b。这只有在字符串没有 As、Ts、Cs 或 Gs 时才成立(即单词没有被交换更改),因此您永远不会打印输出。

于 2012-09-02T03:41:01.470 回答