简体   繁体   English

Python:如果…否则为False语句(布尔值),则返回True

[英]Python : return True if … else False statement (Boolean Value)

Transitions between A <-> G and C <-> T A <-> G和C <-> T之间的过渡
Transversions between A <-> C and G <-> T A <-> C和G <-> T之间的转换

Assignment: 分配:

  • Write a function transition that takes two nucleotides. 编写一个需要两个核苷酸的函数转换。 The function must return a Boolean value that indicates whether or not replacing the first nucleotide by the second nucleotide leads to a transition. 该函数必须返回一个布尔值,该布尔值指示是否用第二个核苷酸替换第一个核苷酸导致转换。

Problem: I don't think the function recognizes the statement behind the or . 问题:我认为函数无法识别or后面的语句。 The code doesn't work in some cases for example: transition('A', 'G') is True and with my code he gives False 该代码在某些情况下不起作用,例如: transition('A', 'G')为True,而对于我的代码,他给出False

  • Write a function ratio that takes two DNA sequences s1 and s2 写一个取两个DNA序列s1和s2的函数比
    The function may assume that both sequences have the same length (the function does not need to check this explicitly). 该函数可以假定两个序列的长度相同(该函数不需要显式检查此长度)。 The function must return the transition/transversion ratio R(s 1 ,s 2 )∈R of the two given sequences as a floating point number. 该函数必须返回两个给定序列的转换/转换比R(s 1,s 2)∈R作为浮点数。 In case there are no transversions between the two sequences, R(s 1 ,s 2 )=0 by definition. 在两个序列之间不存在颠换的情况下,R(s 1,s 2)= 0。

Problem: the code is not working 问题:代码无法正常工作

def transition(letter1, letter2):        
    """
    >>> transition('G', 'A')
    True
    >>> transition('t', 'g')
    False
    >>> transition('C', 'c')
    False
    """    
    return True if letter1.lower() == 'gt' and letter2.lower() == 'ac' or letter1.lower() == 'ac' and letter2.lower() == 'gt' else False


def transversion(letter1, letter2):
    """
    >>> transversion('G', 'A')
    False
    >>> transversion('t', 'g')
    True
    >>> transversion('C', 'c')
    False
    """
    return True if letter1.lower() == 'ct' and letter2.lower() == 'ag' or  letter1.lower() == 'ag' and letter2.lower() == 'ct' else False


def ratio(seq1, seq2):
    """
    >>> ratio('ATTAGCATTATCATC', 'AAATAGGATATATGG')
    0.2222222222222222
    >>> seq1 = 'GCAACGCACAACGAAAACCCTTAGGGACTGGATTATTTCGTGATCGTTGTAGTTATTGGAAGTACGGGCATCAACCCAGTT'
    >>> seq2 = 'ttatctgacaaagaaagccgtcaacggctggataatttcgcgatcgtgctggttactggcggtacgagtgttcctttgggt'
    >>> ratio(seq1, seq2)   
    1.2142857142857142
    """
    count = 0
    tel = 0

    for i in range(len(seq1)):
        if transition(seq1[i], seq2[i]):
            count += 1

    for i in range(len(seq1)):
        if transversion(seq1[i], seq2[i]):
            tel += 1

    if tel != 0:
        return float(count / tel)
    else:
        return 0 

if __name__ == '__main__':
    import doctest
    doctest.testmod()

Change the lines like this 像这样改变线条

return True if letter1.lower() == 'gt' and letter2.lower() == 'ac' or letter1.lower() == 'ac' and letter2.lower() == 'gt' else False

by : 创建人:

return (letter1.lower() == 'gt' and letter2.lower() == 'ac' or letter1.lower() == 'ac' and letter2.lower() == 'gt') 

I think transition or transversion of same nucleobase must return False 我认为同一核碱基的transitiontransversion必须返回False
( ie transition('A','A') ==False ) (即transition('A','A') == False)

You can simplify using simple naming predicat : https://repl.it/N4TC/4 您可以使用简单的命名谓词来简化操作: https : //repl.it/N4TC/4

def transition(nucleobase1, nucleobase2):        
   """ True if both are different and are purine
   """
   return (not isEqual(nucleobase1, nucleobase2) and
           isPurine(nucleobase1) and 
           isPurine(nucleobase2))

def transversion(nucleobase1, nucleobase2):        
   """ True if both are different and not transition
   """
   return (not isEqual(nucleobase1, nucleobase2) and
           not transition(nucleobase1, nucleobase2))

Other predicat : 其他谓词:

### nucleobase Predicat    

def isAdenine(nucleobase):
    """ True if adenine (A)
    """
    return nucleobase.lower()=='a'

def isCytosine(nucleobase):
    """ True if cytosine (C)
    """
    return nucleobase.lower()=='c'

def isGuanine(nucleobase):
    """ True if guanine (G)
    """
    return nucleobase.lower()=='g'

def isThymine(nucleobase):
    """ True if thymine (T)    
    """
    return nucleobase.lower()=='t'

def isPurine(nucleobase):
    """ True if adenine (A) or guanine (G)
    """
    return isAdenine(nucleobase) or isGuanine(nucleobase)

def isPyrimidine(nucleobase):
    """ True if cytosine (C) or thymine (T)
    """
    return isCytosine(nucleobase) or isThymine(nucleobase)

def isEqual(nucleobase1, nucleobase2):
    """ Equal ignore case
    """
    return nucleobase1.lower()==nucleobase2.lower()      

As a general rule of thumb you can if you have multiple conditions assign them to variables first. 通常,如果您有多个条件,则可以先将它们分配给变量。 Might not be the answer you were looking for but possibly can help you write easier-to-read code. 可能不是您要找的答案,但可能可以帮助您编写易于阅读的代码。

Like this: 像这样:

letter1 = "GT"
letter2 = "AC"

def transition(letter1, letter2):

    cond1 = (letter1.lower() == 'gt')
    cond2 = (letter2.lower() == 'ac')
    cond3 = (letter1.lower() == 'ac')
    cond4 = (letter2.lower() == 'gt')

    if (cond1 and cond2) or (cond3 and cond4):
        return True
    else:
        return False

transition(letter1,letter2)

Try this: 尝试这个:

def transition(letter1, letter2):        
   """
   >>> transition('G', 'A')
   True
   >>> transition('t', 'g')
   False
   >>> transition('C', 'c')
   False
   """
   if letter1.lower() == letter2.lower():
       return False

   return (letter1.lower() in 'ag' and letter2.lower() in 'ag') or (letter1.lower() in 'ct' and letter2.lower() in 'ct')

and

def transversion(letter1, letter2):        
   """
   >>> transversion('G', 'A')
   False
   >>> transition('t', 'g')
   True
   >>> transition('C', 'c')
   False
   """
   if letter1.lower() == letter2.lower():
       return False

   return (letter1.lower() in 'ac' and letter2.lower() in 'ac') or (letter1.lower() in 'gt' and letter2.lower() in 'gt')

It seems with letter1.lower() == 'gt' you are trying to check if the letter is either g or t. 似乎与letter1.lower() == 'gt'您正在尝试检查字母是g还是t。 You do that with in instead of == . 您可以使用in代替==

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM