获取字符的补集
下面的代码为什么不能正常工作,来获取输入字符的补充呢?看起来这个循环似乎永远不会结束,但假设我输入'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'