我没有得到正确的答案,但我无法弄清楚我的问题在哪里
def GC_content(genetic_string):
"""
:param genetic_string:
:return: GC content in percentage
:testmod
>>> GC_content("CCACCCTCGTGGTATGGCTAGGCATTCAGGAACCGGAGAACGCTTCAGACCAGCCCGGACTGGGAACCTGCGGGCAGTAGGTGGAAT")
60.919540
"""
counter = 0.0
for index in takewhile(lambda x: x is "C" or x is "G", list(genetic_string)):
counter += 1.0
return counter/float(len(genetic_string))
答案 0 :(得分:2)
您似乎在寻找:
s = list(genetic_string)
return (s.count('G') + s.count('C')) / float(len(s)) * 100
takewhile
只能从迭代(字符串)的开头获取字符,只要给定的条件成立,但您希望查看整个字符串。换句话说,如果你想提出60.919540的结果,takewhile
不是很合适。
答案 1 :(得分:1)
takewhile无效,因为它只返回所有匹配直到第一次不匹配。
In [8]: gc = 'CCACCCTCGTGGTATGGCTAGGCATTCAGGAACCGGAGAACGCTTCAGACCAGCCCGGACTGGGAACCTGCGGGCAGTAGGTGGAAT'
In [9]: list(takewhile(lambda x: x is "C" or x is "G", gc))
Out[9]: ['C', 'C']
答案 2 :(得分:1)
您的代码必须看起来像这样才能工作:
from itertools import takewhile
def GC_content(genetic_string):
"""
:param genetic_string:
:return: GC content in percentage
:testmod
>>> GC_content("CCACCCTCGTGGTATGGCTAGGCATTCAGGAACCGGAGAACGCTTCAGACCAGCCCGGACTGGGAACCTGCGGGCAGTAGGTGGAAT")
60.919540
"""
counter = 0.0
for c in list(genetic_string):
if(c == 'C' or c=='G'):
counter += 1.0
return counter/float(len(genetic_string)) * 100
result = GC_content("CCACCCTCGTGGTATGGCTAGGCATTCAGGAACCGGAGAACGCTTCAGACCAGCCCGGACTGGGAACCTGCGGGCAGTAGGTGGAAT")
print(result) # 60.91954022988506
takewhile返回元素,直到谓词返回" FALSE"第一次(即计数器只会增加两次 - 第一次" CC"字母)。要理解存在与使用" takewhile"
时相同的逻辑代码部分for c in list(genetic_string):
if(c == 'C' or c=='G'):
counter += 1.0
else:
break
此外,您忘记将结果乘以100," Is"运算符不用于比较值 - 它比较值的类型(检查"整数不是字符串"例如)