搜索
查看: 3700|回复: 2

python [Rosalind]-14 [LCSM] Finding a Shared Motif 最大公共motif

[复制链接]

8

主题

29

帖子

953

积分

高级会员

Rank: 4

积分
953
QQ
发表于 2017-3-8 10:33:36 | 显示全部楼层 |阅读模式
本帖最后由 zd200572 于 2017-3-8 10:38 编辑

才学python,不才,水平太差,编程能力几乎还没有,学习了各位的前13个程序,依葫芦画瓢,第14题实在想不出算法,查找了许多最大子序列的算法,还是没搞定。最后在github上搜索Rosalind,找到了一个大神的解答,在这里斗胆发帖,告诉大家github上有大牛的解答。这里贴上一题。这个题目原程序有一个readFasta模块不知道怎么导入,应该是作者自己的模块?参考各位之前的程序,补上了几行,让程序跑了起来。但是,运行原题的那个txt文件会报错keyerror, 而运行几条序列正常,不知为何,还请各位指正。初次发帖,多多关照!
[mw_shl_code=python,true]'''
A solution to a ROSALIND bioinformatics problem.
Problem Title: Finding a Shared Motif
Rosalind ID: LCSM
Rosalind #: 014
URL: http://rosalind.info/problems/lcsm/
'''

def LongestSubstring(string_list):
        '''Extracts all substrings from the first string in a list, and sends longest substring candidates to be checked.'''
        longest = ''
        for start_index in range(len(string_list[0])):
                for end_index in range(len(string_list[0]), start_index, -1):
                        # Break if the length becomes too small, as it will only get smaller.
                        if end_index - start_index <= len(longest):
                                break
                        elif CheckSubstring(string_list[0][start_index:end_index], string_list):
                                longest =  string_list[0][start_index:end_index]

        return longest

def CheckSubstring(find_string, string_list):
        'Checks if a given substring appears in all members of a given collection of strings and returns True/False.'
        for string in string_list:
                if (len(string) < len(find_string)) or (find_string not in string):
                        return False
        return True

seq = {}
seq_name = ''
with open('C:\\Users\\shenyou\\Desktop\\bioinfo\\workflow\\lcms.txt', encoding='utf-8') as f:
        for line in f:
                if line[0] == '>':
                        seq_name = line.rstrip()
                        seq[seq_name] = ''
                        continue
                else:
                        seq[seq_name] += (line.rstrip()).upper()
        
print(seq)

if __name__ == '__main__':
    dna = []
    for seq_name in seq:
            dna.append(seq[seq_name])

    lcsm = LongestSubstring(dna)
    print(lcsm)
    with open('014_LCSM.txt', 'w') as output_data:
            output_data.write(lcsm)[/mw_shl_code]




上一篇:第四章 统计推断(生物统计学基础)
下一篇:如何得到基因的GO注释?
欢迎交流!
https://github.com/zd200572/
https://jiawen.zd200572.com
回复

使用道具 举报

0

主题

16

帖子

145

积分

注册会员

Rank: 2

积分
145
发表于 2017-5-20 17:46:40 | 显示全部楼层
python也没学多久,大概思路和你一样。但是用了一些小技巧,可能稍微要快一些。

但是暴力搜索总是要比动态规划慢,期待看到动态规划的答案。

[mw_shl_code=applescript,true]def readfasta(filename, sample):
    fa = open(filename, 'r')
    fo = open(sample, 'w')
    res = {}
    rres = []
    ID = ''
    for line in fa:
        if line.startswith('>'):
            ID = line.strip('\n')
            res[ID] = ''
        else:
            res[ID] += line.strip('\n')

    for key in res.values():
        rres.append(key)
        fo.write(key + '\n')
    return rres


def fragement(seq_list):
    res = []
    seq = seq_list[0]
    for i in range(len(seq)):
        s_seq = seq[i:]
        for j in range(len(s_seq)):
            res.append(s_seq[len(s_seq) - j)])

    return res


def main(infile, sample):
    seq_list = readfasta(infile, sample)
    frags = fragement(seq_list)
    frags.sort(key=len, reverse=True)
    for i in range(len(frags)):
        ans = []
        # s = 0
        # m+=1
        # print(m)
        # res[frags] = 0
        for j in seq_list:
            r = j.count(frags)
            if r != 0:
                ans.append(r)
        if len(ans) >= len(seq_list):
            print(frags)
            break


main('rosalind_lcsm.txt', 'sample.txt')[/mw_shl_code]
回复 支持 1 反对 0

使用道具 举报

8

主题

29

帖子

953

积分

高级会员

Rank: 4

积分
953
QQ
 楼主| 发表于 2017-3-8 10:37:08 | 显示全部楼层
https://github.com/jschendel/Rosalind
这是大神的github地址,一些程序会报错'gbk' codec can't encode character, 查大神的博客文件读写的时候要加上encoding='utf-8'
欢迎交流!
https://github.com/zd200572/
https://jiawen.zd200572.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2020-2-17 16:01 , Processed in 0.026031 second(s), 30 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.