python练习题3 孟德尔遗传定律 统计子代基因型为显性的概率

来源:互联网 发布:js插件编写 编辑:程序博客网 时间:2024/05/02 04:25

题目在这:http://rosalind.info/problems/iprb/



解这一题可以有两种思路,一种是穷举法,把所有子代的基因型全部列举出来,并放入字典中,然后再计算其中显性基因的概率。

#*_coding: utf-8_*import numpy as npdef character_list(parent_number):    '''输入包含纯合,杂合样本的数量的信息的列表,得到所有样本性状的列表'''    all_character_list = ['HH'] * parent_number[0] + ['Hr'] * parent_number[1] + ['rr'] * parent_number[2]    return all_character_listdef character_probabily(character_A, character_B):    '''统计两个亲本性状的所有可能子代的基因型'''    total = {'HH':0, 'Hr':0, 'rr':0, 'rH':0}    for base_A in character_A:        for base_B in character_B:            later = base_A + base_B            total[later] +=1    HH = total['HH']    Hr = total['Hr'] + total['rH']    rr = total['rr']    return HH, Hr, rrdef main(parent_number):    total_number = {'HH':0, 'Hr':0, 'rr':0}    all_character_list = character_list(parent_number)    '''统计所有可能得子代基因型,保存在字典中'''    for i in range(len(all_character_list)-1):        character_A = all_character_list[i]        for j in range(i+1, len(all_character_list)):            character_B = all_character_list[j]            HH, Hr, rr = character_probabily(character_A, character_B)            total_number['HH'] +=HH            total_number['Hr'] +=Hr            total_number['rr'] +=rr    dominance = float((total_number['HH'] + total_number['Hr'])) / sum(total_number.values())    print '子代为显性的可能性为:%.6f'%dominance#按照格式,输入纯合,杂合样本的数量,并转换成数值格式的列表parent = raw_input('请分别输入纯显,杂合,纯隐的样本数(k,m,n):')parent_number = map(int, parent.split(','))main(parent_number)



当然,这种方法比较话费时间,如果亲代数目较多,那子代的数量也会成倍增加。因此可以用统计学的思想来解决这个问题。可以反推,先计算出子代隐形基因型的概率:P(隐)=(2C2+1/4*2C2 + 1/2*2C1*2C1),那么显性基因的概率P(显)=1-P(隐)

from scipy.misc import comb  individuals = input('Number of individuals(k,m,n):')[k, m, n] = map(int,individuals.split(','))t = k+m+n rr = comb(n,2)/comb(t,2)hh = comb(m,2)/comb(t,2)hr = comb(n,1)*comb(m,1)/comb(t,2) prob = 1 - (rr+hh*1/4+hr*1/2)  print (prob)



原创粉丝点击