我没有得到正确的答案,但我不知道我的问题在哪里
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))发布于 2014-08-04 08:05:47
你似乎在寻找:
s = list(genetic_string)
return (s.count('G') + s.count('C')) / float(len(s)) * 100只要给定的条件保持不变,takewhile只接受可迭代(字符串)开头的字符,但您希望查看整个字符串。换句话说,如果您希望得到60.919540的结果,那么takewhile就不太合适了。
发布于 2014-08-04 08:11:08
因为它只返回上的所有匹配,直到第一个不匹配的才有效。
In [8]: gc = 'CCACCCTCGTGGTATGGCTAGGCATTCAGGAACCGGAGAACGCTTCAGACCAGCCCGGACTGGGAACCTGCGGGCAGTAGGTGGAAT'
In [9]: list(takewhile(lambda x: x is "C" or x is "G", gc))
Out[9]: ['C', 'C']发布于 2014-08-04 08:20:19
您的代码必须如下所示才能根据需要工作:
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获取返回元素,直到谓词第一次返回"FALSE“(即计数器只增加两倍-对于第一个"CC”字母)。要理解代码中有相同的部分,其逻辑与使用“接受时”相同。
for c in list(genetic_string):
if(c == 'C' or c=='G'):
counter += 1.0
else:
break此外,您也忘记将结果乘以100," is“运算符不用于比较值-它比较值的类型(例如检查”整数不是字符串“)。
https://stackoverflow.com/questions/25114093
复制相似问题