搜索
123
返回列表 发新帖
楼主: 深藏功与名

[新人求教]找出CG含量最大的DNA片段

[复制链接]

0

主题

5

帖子

100

积分

注册会员

Rank: 2

积分
100
QQ
发表于 2018-7-2 13:12:43 | 显示全部楼层
[Python] 纯文本查看 复制代码
MAX_CG=0        #CG含量最大的DNA的CG值
MAX_title=''    #CG含量最大的DNA的名称
with open("d:/【生物信息学】/MyPrograms/ROSALIND/rosalind_GC.txt", 'r') as inputs:
    title = ''
    tot = 0                 # 判断是否是第一次读入DNA名称的标志,避免计算CG值时DNA长度为0的情况出现。
    CG = 0
    line = inputs.readline()
    while  line:
        if line[0] is '>':      #判断读入的行是否是DNA名称
            if tot == 0:        #判断是否是第一次读入DNA名称,避免len(DNA)=0的情况
                MAX_title = line[1:-1]      #第一次读入DNA名称,直接赋值给MAX_title
                tot += 1                    #更改标志tot的值
            else:
                CG = (DNA.count('C') + DNA.count('G')) / len(DNA) * 100     #计算当前DNA片段的CG值
                if CG > MAX_CG:
                    MAX_CG = CG             #当当前CG值大于最大值时,用当前的CG值和DNA名称替换最大值
                    MAX_title = title
            title = line[1:-1]              #替换掉当前保存的DNA的名称
            DNA = ''                        #清空DNA序列
        elif line[-1] == '\n':              #文件最后一行DNA序列末尾没有换行符'\n',所以需要特殊判断
            DNA += line[0:-1]
        else:
            DNA += line
        line = inputs.readline()
    else:                                   #最后一次读入的DNA序列并未与最大值比较,所以需要再计算一次。
        CG = (DNA.count('C') + DNA.count('G')) / len(DNA) * 100
        if CG > MAX_CG:
            MAX_CG = CG
            MAX_title = title
    print(MAX_title,'\n%f'% MAX_CG)


总结:
①边读入数据,边处理比较,没有使用数组等数据结构,占用空间比较小。
②没有考虑极限情况,两个DNA片段CG值完全相等,取字母顺序在前的DNA片段名称,不过也就是多加一个条件判断的事情。
③python没有直到型循环,所以需要额外写代码做最后一次判断。
回复 支持 反对

使用道具 举报

1

主题

22

帖子

160

积分

注册会员

Rank: 2

积分
160
发表于 2019-6-15 08:53:29 | 显示全部楼层
python 写的
f=open('找出CG含量最大的DNA片段.txt')
lines=f.readlines()
dict1={}
for line in lines[6:]:
    line=line.strip()
    if line.startswith('>'):
        k=line
        dict1[k]=''
    else:
        dict1[k]+=line
GC_list=[]

for v in dict1.values():
    n=0
    for letter in v:
        if letter=='G' or letter=='C':
            n+=1
    GC_list.append(n/len(v))
keys=[]
for k in dict1.keys():
    keys.append(k)
for each_GC in GC_list:
    if each_GC==max(GC_list):
        print(keys[GC_list.index(each_GC)])
        print(each_GC)
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|生信技能树 ( 粤ICP备15016384号  

GMT+8, 2019-10-23 06:50 , Processed in 0.078978 second(s), 21 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.