【问题标题】:Sequence match using Python使用 Python 进行序列匹配
【发布时间】:2015-06-02 19:01:09
【问题描述】:

我正在研究 RNA 序列匹配

seq = 'UCAGCUGUCAGUCAUGAUC'
sub_seq =['UGUCAG', 'CAGUCA', 'UCAGCU','GAUC']

我是把sub_seq跟seq匹配,匹配的sub_seq在seq下面,如果没有匹配就用虚线。输出如下所示:

UCAGCUGUCAGUCAUGAUC
UCAGCU--CAGUCA-GAUC
-----UGUCAG--------

我尝试使用字典来做到这一点

index_dict = {}
for i in xrange(len(sub_seq)):
    index_dict[seq.find(sub_seq[i])] = {}
    index_dict[seq.find(sub_seq[i])]['sequence'] = sub_seq[i]
    index_dict[seq.find(sub_seq[i])]['end_index'] = seq.find(sub_seq[i]) + len(sub_seq[i]) - 1

我无法弄清楚进行对齐的算法,任何帮助将不胜感激!

【问题讨论】:

    标签: python alignment sequence


    【解决方案1】:

    假设您让我稍微更改您的index_dict,请考虑:

    seq = 'UCAGCUGUCAGUCAUGAUC'
    sub_seq =['UGUCAG', 'CAGUCA', 'UCAGCU','GAUC']
    
    index_dict = {}
    for i in xrange(len(sub_seq)):
        index_dict[seq.find(sub_seq[i])] = {
            'sequence':  sub_seq[i],
            'end_index': seq.find(sub_seq[i]) + len(sub_seq[i])   # Note this changed
        }
    sorted_keys = sorted(index_dict)
    
    lines = []
    while True:
        if not sorted_keys: break
        line = []
        next_index = 0
        for k in sorted_keys:
            if k >= next_index:
                line.append(k)
                next_index = index_dict[k]['end_index']
        # Remove keys we used, append line to lines
        for k in line: sorted_keys.remove(k)
        lines.append(line)
    
    # Build output lines
    olines = []
    for line in lines:
        oline = ''
        for k in line:
            oline += '-' * (k - len(oline))     # Add dashes before subseq
            oline += index_dict[k]['sequence']  # Add subsequence
        oline += '-' * (len(seq) - len(oline))  # Add trailing dashes
        olines.append(oline)
    
    print seq
    print '\n'.join(olines)
    

    输出:

    UCAGCUGUCAGUCAUGAUC UCAGCU--CAGUCA-GAUC -----UGUCAG--------

    请注意,这非常冗长,可以稍微精简一下。 while Truefor line in lines 循环可能会合并为一个,但它应该有助于解释一种可能的方法。

    编辑:这是您可以加入最后两个循环的一种方式:

    seq = 'UCAGCUGUCAGUCAUGAUC'
    sub_seq =['UGUCAG', 'CAGUCA', 'UCAGCU','GAUC']
    
    index_dict = {}
    for i in xrange(len(sub_seq)):
        index_dict[seq.find(sub_seq[i])] = {
            'sequence':  sub_seq[i],
            'end_index': seq.find(sub_seq[i]) + len(sub_seq[i])   # Note this changed
        }
    sorted_keys = sorted(index_dict)
    
    lines = []
    while True:
        if not sorted_keys: break
        line = ''
        next_index = 0
        keys_used = []
        for k in sorted_keys:
            if k >= next_index:
                line += '-' * (k - len(line))           # Add dashes before subseq
                line += index_dict[k]['sequence']       # Add subsequence
                next_index = index_dict[k]['end_index'] # Update next_index
                keys_used.append(k)                     # Mark key as used
        for k in keys_used: sorted_keys.remove(k)       # Remove used keys
        line += '-' * (len(seq) - len(line))            # Add trailing dashes
        lines.append(line)                              # Add line to lines
    
    print seq
    print '\n'.join(lines)
    

    输出:

    UCAGCUGUCAGUCAUGAUC UCAGCU--CAGUCA-GAUC -----UGUCAG--------

    【讨论】:

      【解决方案2】:
      seq_l = len(seq)
      for ele in sub_seq:
          start = seq.find(ele)
          ln = len(ele)
          if start != -1:
              end = start + ln
              print("-" * start + ele + "-"*(seq_l- end))
          else:
              print("-" * seq_l)
      
      -----UGUCAG--------
      --------CAGUCA-----
      UCAGCU-------------
      ---------------GAUC
      

      不确定UCAGCU--CAGUCA-GAUC 来自哪里,因为您在代码中一次只使用一个子序列

      【讨论】:

      • 我没有投反对票,但我的猜测是因为输出与 OP 想要的不匹配。
      • @jedwards,我使用了 OP 自己的代码。如果 OP 确实需要,做更多事情是非常微不足道的。只需检查不重叠的字符串并相应地进行调整
      • 我同意,我只是猜测原因
      • sub_seq 是一个包含不同序列片段的单个列表,它们来自实验数据。感谢您的回答!
      猜你喜欢
      • 2016-08-05
      • 1970-01-01
      • 2016-05-13
      • 2020-02-03
      • 1970-01-01
      • 1970-01-01
      • 2016-03-03
      • 1970-01-01
      • 2017-04-24
      相关资源
      最近更新 更多