Python 2.7 如何在python中使用takeWhile
我没有得到正确的答案,但我不知道我的问题在哪里Python 2.7 如何在python中使用takeWhile,python-2.7,Python 2.7,我没有得到正确的答案,但我不知道我的问题在哪里 def GC_content(genetic_string): """ :param genetic_string: :return: GC content in percentage :testmod >>> GC_content("CCACCCTCGTGGTATGGCTAGGCATTCAGGAACCGGAGAACGCTTCAGACCAGCCCGGACTGGGAACCTGCGGGCAGT
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))
你似乎在寻找:
s = list(genetic_string)
return (s.count('G') + s.count('C')) / float(len(s)) * 100
takewhile
只从iterable(字符串)的开头提取字符,只要给定条件成立,但您希望查看整个字符串。换句话说,takewhile
如果您希望得到60.919540的结果,则不太合适。您似乎在寻找:
s = list(genetic_string)
return (s.count('G') + s.count('C')) / float(len(s)) * 100
takewhile
只从iterable(字符串)的开头提取字符,只要给定条件成立,但您希望查看整个字符串。换句话说,takewhile
如果您希望得到60.919540的结果,则不太合适。takewhile不起作用,因为它只返回所有匹配项,直到第一个不匹配项
In [8]: gc = 'CCACCCTCGTGGTATGGCTAGGCATTCAGGAACCGGAGAACGCTTCAGACCAGCCCGGACTGGGAACCTGCGGGCAGTAGGTGGAAT'
In [9]: list(takewhile(lambda x: x is "C" or x is "G", gc))
Out[9]: ['C', 'C']
takewhile不工作,因为它只返回所有匹配项,直到第一个不匹配项
In [8]: gc = 'CCACCCTCGTGGTATGGCTAGGCATTCAGGAACCGGAGAACGCTTCAGACCAGCCCGGACTGGGAACCTGCGGGCAGTAGGTGGAAT'
In [9]: list(takewhile(lambda x: x is "C" or x is "G", gc))
Out[9]: ['C', 'C']
您的代码必须如下所示才能根据需要工作:
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”时的逻辑相同
此外,您忘了将结果乘以100,“Is”运算符不用于值的比较-它比较值的类型(例如,检查“integer不是string”)您的代码必须如下所示才能根据需要工作:
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”时的逻辑相同
另外,您忘记了将结果乘以100,“Is”运算符不用于值的比较-它比较值的类型(例如,检查“integer不是string”)是的,但我想知道为什么takewhile的实现不起作用。我要看看我的车在哪里error@jd1215:如我所说,只要条件为true,takewhile只从字符串开头提取字符。因此,它不会遍历整个字符串,只要找到不符合条件的字符,它就会停止。是的,但我想知道为什么takewhile的实现不起作用。我要看看我的车在哪里error@jd1215:如我所说,只要条件为true,takewhile只从字符串开头提取字符。因此,它不会遍历整个字符串,只要找到不符合条件的字符,它就会停止。