获取字符的补集

-1 投票
2 回答
4575 浏览
提问于 2025-04-18 11:34

下面的代码为什么不能正常工作,来获取输入字符的补充呢?看起来这个循环似乎永远不会结束,但假设我输入'Z'作为DNA,为什么它不会停止并退出呢?我是不是把break或者if用错了?那elif呢?

def 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 ('')

2 个回答

0

根据你的例子(还有Cyber根据你的例子写的回答),你没有得到互补序列。你得到的是A -> C(而不是互补的T),T -> G而不是A,等等。

使用字典,就像Cyber那样,应该是这样的:

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

这里“original”会得到“TAGCAGT”,“bad_original”会提示“包含非DNA字符”。

注意,这里说的是互补序列,而不是反向互补序列,后者通常更受关注。

更一般来说,如果你打算用这个处理DNA序列,可能需要看看BioPython模块(http://biopython.org/wiki/Seq#Complement_and_reverse_complement),它可以更灵活地获取互补序列(和反向互补序列),并且有更多的错误检查等功能。

3

你应该建立一个地图,使用一个 字典

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

然后对于某个字符串,你可以这样做:

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

输出结果

'CGATGAC'

如果只是处理一个单独的字符:

complement['A']

输出结果

'C'

撰写回答