当我运行程序时,它总是打印为true。例如,如果我输入AAJJ,它将打印为true,因为只检查第一个字母是否为真。 有人能指出我正确的方向吗?谢谢!
squence_str = raw_input("Enter either A DNA, Protein or RNA sequence:")
def DnaCheck():
for i in (squence_str):
if string.upper(i) =="A":
return True
elif string.upper(i) == "T":
return True
elif string.upper(i) == "C":
return True
elif string.upper(i) == "G":
return True
else:
return False
print "DNA ", DnaCheck()
答案 0 :(得分:7)
您需要检查DNA序列中所有碱基是否有效。
def DnaCheck(sequence):
return all(base.upper() in ('A', 'C', 'T', 'G') for base in sequence)
答案 1 :(得分:2)
我喜欢@亚历山大的回答,但对于多样性你可以看到
def dna_check(sequence):
return set(sequence.upper()).issubset("ACGT")
# another possibility:
# return set(sequence).issubset("ACGTacgt")
在长序列上可能更快,特别是如果作为合法序列的几率是好的(即大多数情况下你将不得不迭代整个序列)。
答案 2 :(得分:0)
更多关于你目前学习的水平......
你的逻辑逆转了。你必须检查所有的位置。如果它们中的任何一个未能在“ACTG”中识别出核苷酸,那么您会立即为该字符串返回 False 。只有当您通过所有字符时,才能自信地返回 True 。
import string
def DnaCheck(squence_str):
for i in (squence_str):
if string.upper(i) not in "ACTG":
return False
return True
test_cases = ["", "AAJJ", "ACTG", "AACTGTCAA", "AACTGTCAX"]
for strand in test_cases:
print strand, DnaCheck(strand)
输出:
True
AAJJ False
ACTG True
AACTGTCAA True
AACTGTCAX False