计算肽链的分子量

http://rosalind.info/problems/prtm/

值得注意的是,最后一个氨基酸中一个水分子的分子量18.01056 Da. 但我的结果中没有加上这个水,仍然提示我为正确答案,可见还是比较宽松的。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
#!/usr/bin/env python
mass_table = dict(A=71.03711, C=103.00919, D=115.02694, E=129.04259, F=147.06841, G=57.02146, H=137.05891, I=113.08406,
                  K=128.09496, L=113.08406, M=131.04049, N=114.04293, P=97.05276, Q=128.05858, R=156.10111, S=87.03203,
                  T=101.04768, V=99.06841, W=186.07931, Y=163.06333)
prot_mass = 0
with open("rosalind_prtm.txt") as prot:
    pro_line = prot.readline().strip()
#    for i in range(len(pro_line)):
#        prot_mass += mass_table[pro_line[i]]
    for i in pro_line:
        prot_mass += mass_table[i]
    print(prot_mass)

他山之石

快速输入字符串,并转换为字典的方式值得学习。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
mmt = """
A   71.03711
C   103.00919
D   115.02694
E   129.04259
F   147.06841
G   57.02146
H   137.05891
I   113.08406
K   128.09496
L   113.08406
M   131.04049
N   114.04293
P   97.05276
Q   128.05858
R   156.10111
S   87.03203
T   101.04768
V   99.06841
W   186.07931
Y   163.06333
""".split()
mmt = dict(zip(mmt[::2],map(float,mmt[1::2])))

s = "SKADYEK"
print "%.2f"%(sum(map(lambda x:mmt[x],s))+18.01528)

孟德尔第二定律

http://rosalind.info/problems/lia/

亲本(第0代)的基因型为AaBb,与基因型同为AaBa的个体产生2个后代。之后,每个个体产生2个后代,且均与AaBa基因型的个体婚配。求在第k代的所有个体中,至少有N个个体的基因型为AaBb的概率。

题干中专门提示了不需要计算每一代中个体AaBb基因型婚配的具体情况。这是因为每代的个体都与AaBa婚配,因此种群中A/a,B/b基因型的频率保持不变,一直为1/2。因此每一代中个体为AaBb基因型的概率均为1/2*1/2=1/4。

接下来就是一个高中概率论的排列组合问题。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#!/usr/bin/env python
with open("rosalind_lia.txt") as f:
    (k, N) = f.readline().strip().split(" ")
    k = int(k)
    N = int(N)

#计算排列数A(m, n)
def aR(m, n):
    be = 1
    for i in range(n):
        be *= m - i
    return be

#计算组合数C(m, n)
def cR(m, n):
    if m < n:
        print("error input")
    else:
        return aR(m, n) / aR(n, n)

#计算第k代(2^k个体)中至少含有N个0.25概率事件发生的总概率
rate = 0
for i in range(N):
    rate += cR(2 ** k, i) * 0.25 ** i * 0.75 ** (2 ** k - i)

ans = 1 - rate
print(ans)

他山之石

其他人的答案中,使用R能够更方便地进行这个排列组合计算

1
pbinom(N-1, 2^k, 0.25, lower.tail=F)

python中使用scipy也可以计算排列组合

1
2
3
4
5
>> from scipy.special import comb, perm
>> perm(3, 2)
6.0
>> comb(3, 2)
3.0

参考来源

http://rosalind.info/problems/prtm/solutions/

http://rosalind.info/problems/lia/solutions/

https://blog.csdn.net/lanchunhui/article/details/51824602