如何在python中使用takeWhile

时间:2014-08-04 08:00:53

标签: python-2.7

我没有得到正确的答案,但我无法弄清楚我的问题在哪里

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))

3 个答案:

答案 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"运算符不用于比较值 - 它比较值的类型(检查"整数不是字符串"例如)