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只从字符串开头提取字符。因此,它不会遍历整个字符串,只要找到不符合条件的字符,它就会停止。