0

我有以下公式:

C=P 1 *4 (n-1) +P 2 *4 (n-2) +......+P i *4 (ni) +P n +1,

P 可以取其中一个值{'a','c','g','t'},以及 、和a is 0的值。例如我的序列是,我想计算这个序列的C,对于这个例子c is 1g is 2t is 3s='act'

  • P 1 =0,
  • P 2 =1,
  • P n =3。

所以结果C=8。我的代码如下所示:

def identicalSegment(): 
    for i in range(1,len(s)):
        if s[i]=='a': 
            p[i]=0 
        elif s[i]=='c': 
            p[i]=1 
        elif s[i]=='g': 
            p[i]=2 
        elif s[i]=='t': 
            p[i]=3 

    c=p[1]*4(pow(n-1))+p[2]*(pow(n-2))+p[n]+1 

    return c

我尝试用 python 做到这一点,但我遇到了if语句的问题。有任何想法吗?

4

4 回答 4

4

if您可以使用这样的字典来避免丑陋的 s:

code={'a':0,'c':1,'g':2,'t':3}
p=[code[i] for i in s]

另请注意,在 Python 中,索引从 0 开始,而不是 1。

最后,要计算c,您应该迭代p。您需要对这部分代码进行一些工作。

于 2013-07-13T22:58:18.547 回答
1

使用Bitwise 的答案来生成P值,如下所示给出了预期的结果8

def identical_segment(input_string):

    # get the P values from the dictionary
    code = {"a": 0, "c": 1, "g": 2, "t": 3}
    p = [code[i] for i in input_string]

    # calculate length
    n = len(input_string)
    c = 0

    # calculate the score
    for i, n in enumerate(range(n, 0, -1)):
        c += p[i]*(4**(n - 1))

    # add one to the return value to account for the last digit
    return c + 1

在我的 Python 终端中运行,这给出:

>>> identical_segment("act")
... 8

或者

>>> identical_segment("gattaca")
... 9157

:)

于 2013-07-13T23:18:57.340 回答
0

您可以使用它来代替字典。

p = ['acgt'.find(i) for i in s]
于 2013-07-14T00:46:49.083 回答
0

CODE_VALUES = {'a':0,'c':1,'g':2,'t':3}
MAGIC_VALUE_ONE = 4

def GetValues(lst):
    n = len(lst)
    for index, item in enumerate(lst):
        P = CODE_VALUES[item]
        multiplier = pow(MAGIC_VALUE_ONE, n - index - 1)
        yield P * multiplier

def CalculateSum(calc_string):
    return sum(GetValues(calc_string)) + 1

print CalculateSum('act')
于 2013-07-13T23:28:53.347 回答