【问题标题】:Bioinformatics: matching list items with dictionary keys and printing the matching keys [closed]生物信息学:将列表项与字典键匹配并打印匹配键[关闭]
【发布时间】:2018-11-03 22:28:04
【问题描述】:

家庭作业帮助

我需要编写一个函数,该函数能够从用户那里获取包含 DNA 密码子的字符串,例如

'ACATTTGCTTCTGACACAACTGTGTTCACTAGCAACCTCAAAC'

将字符串分成 3 个组,然后将每个组与字典项匹配。但是程序只能打印出键,而不是值。

输入:ATTGHIATGTTTTTCTYU

分离:[ATT] [GHI] [ATG] [TTT] [TTC] [TYU]

输出:IMFF

这是我目前所拥有的

dna_codons = {'I': 'ATT' 'ATC' 'ATA',
              'L': 'CTT' 'CTC' 'CTA' 'CTG' 'TTA' 'TTG',
              'V': 'GTT' 'GTC' 'GTA' 'GTG',
              'F': 'TTT' 'TTC',
              'M': 'ATG',
              }
def translate(sequence):
    n = 3
    MyList = [sequence[i:i+n] for i in range(0, len(sequence), n)]
    for codon in MyList:
        for slc in dna_codons.keys():
            if codon == slc:
                print slc

print translate(raw_input('type in DNA sequence: '))

【问题讨论】:

    标签: python function bioinformatics python-2.x


    【解决方案1】:

    您可以通过列表推导和生成器将输入字符串拆分为块来更轻松地实现目标。

    试试这样的:

    in_seq = 'ATTGHIATGTTTTTCTYU'  # change this to input()
    
    _codes = {  # your original dict is incorrect
        'ATT': 'I', 'ATC': 'I', 'ATA': 'I',
        'CTT': 'L', 'CTC': 'L', 'CTA': 'L', 'CTG': 'L', 'TTA': 'L', 'TTG': 'L',
        'GTT': 'V', 'GTC': 'V', 'GTA': 'V', 'GTG': 'V',
        'TTT': 'F', 'TTC': 'F',
        'ATG': 'M',
    }
    
    
    def split_seq(s, n=2):
        """ split string to chunks of size n """
        i = 0
        while i < len(s):
            yield s[i:i + n]
            i += n
    
    out_codes = [_codes[z.upper()] for z in split_seq(in_seq, 3) if z.upper() in _codes]
    result = ''.join(out_codes)
    print(result)
    

    输出:

    IMFF

    如果要查看分隔列表,请输入print(list(split_seq(in_seq, 3)))

    ['ATT', 'GHI', 'ATG', 'TTT', 'TTC', 'TYU']


    更新

    如果你不想使用生成器,用这个普通函数替换它:

    def split_seq(s, n=2):
        res = []
        i = 0
        while i < len(s):
            res.append(s[i:i + n])
            i += n
        return res
    

    【讨论】:

    • 谢谢伙计。我还没有了解“收益”。这对我来说很新鲜。那有什么作用?
    • 不客气:) yield 有点类似于return。它用于称为生成器的特殊功能。您可以在此处了解更多信息 - stackoverflow.com/questions/231767/…
    • 更新了答案。你可以用一个普通函数替换一个生成器,它简单地返回一个list,它代表一个分割的输入字符串。
    【解决方案2】:

    您的代码的主要问题是'I': 'ATT' 'ATC' 'ATA', 不起作用。字符串只是连接在一起(ATTATCATA)。您需要将这些字符串转换为列表:'I': ['ATT', 'ATC', 'ATA'],。然后,您可以使用嵌套循环来遍历字典和列表:

    for slc in dna_codons.keys():
        for item in dna_codons[slc]:
            if codon == item:
                print slc
    

    最后,最后的 print 语句将始终打印 none,因为您的函数不会返回任何要打印的内容。理想情况下,您的函数应该返回所需的输出,而不是将其作为副作用打印出来:

    aa_seq =''
    for codon in MyList:  
        for slc in dna_codons.keys():
            for item in dna_codons[slc]:
                if codon == item:
                    aa_seq += slc
    return aa_seq
    

    当然,如果您必须遍历每个密码子的所有值,那么使用字典并不会带来太多好处。将密码子设为,将氨基酸设为会更有效。这样你就可以使用:

    aa_seq = ''
    for codon in MyList:
        aa_seq += dna_codons[codon]
    return aa_seq
    

    【讨论】:

      【解决方案3】:

      首先,您必须更改 dna_codons 以将值作为列表或元组。目前,三元组的字符串只会连接成一个字符串。

      dna_codons = {
          'I': ['ATT', 'ATC', 'ATA'],
          'L': ['CTT', 'CTC', 'CTA', 'CTG', 'TTA', 'TTG'],
          'V': ['GTT', 'GTC', 'GTA', 'GTG'],
          'F': ['TTT', 'TTC'],
          'M': ['ATG'],
      }
      

      现在您可以使用@heathobrien 的嵌套循环,但是这些循环非常低效。我认为您应该更改字典,以便它从密码子映射到氨基酸。你可以这样做:

      def transpose(d):
          out = {}
          for key, values in d.items():
              for val in values:
                  out[val] = key
          return out
      
      codon_to_aa = transpose(dna_codons)
      

      这会产生一个字典{'ATG': 'M', 'ATT': 'I', 'ATC': 'I', ...}。 在那之后,剩下的就很简单了。您只需要拆分序列并找到适当的映射。重用您的代码:

      def translate(sequence):
          n = 3
          codons = (sequence[i:i+n] for i in range(0, len(sequence), n))
          for codon in codons:
              print codon_to_aa.get(codon, ''),
          print
      
      translate(raw_input('type in DNA sequence: '))
      

      第一个print 后面的逗号确保下一个字符在同一行上打印出来。空的print 将结束该行。但是,我建议您将输出汇总到一个变量中并一次打印出来。

      或者:

      def translate(sequence):
          n = 3
          return ''.join(codon_to_aa.get(codon, '') for codon in   
                            (sequence[i:i + n] for i in xrange(0, len(sequence), n)))
      
      print translate(raw_input('type in DNA sequence: '))
      

      【讨论】:

      • 你在def transponse(d):中有错字
      【解决方案4】:

      这是一种使用 itertools 配方的生成器函数 grouper() 的方法。

      from itertools import zip_longest
      
      def grouper(iterable, n, fillvalue=None):
          "Collect data into fixed-length chunks or blocks"
          # s -> (s0,s1,...sn-1), (sn,sn+1,...s2n-1), (s2n,s2n+1,...s3n-1), ...
          # grouper('ABCDEFG', 3, 'x') --> ABC DEF Gxx"
          args = [iter(iterable)] * n
          return zip_longest(*args, fillvalue=fillvalue)
      
      DNA_CODONS = {
          'ATT': 'I', 'ATC': 'I', 'ATA': 'I',
          'CTT': 'L', 'CTC': 'L', 'CTA': 'L', 'CTG': 'L', 'TTA': 'L', 'TTG': 'L',
          'GTT': 'V', 'GTC': 'V', 'GTA': 'V', 'GTG': 'V',
          'TTT': 'F', 'TTC': 'F',
          'ATG': 'M',
      }
      
      def translate(sequence, n=3):
          return [codeon for codeon in (''.join(nt) for nt in grouper(sequence, n, ' ')
                  if codeon in DNA_CODONS)]
      
      input_sequence = 'ACATTTGCTTCTGACACAACTGTGTTCACTAGCAACCTCAAAC'
      print(translate(input_sequence))  # -> [['TTT'], ['GTG'], ['TTC'], ['CTC']]
      

      【讨论】:

        猜你喜欢
        • 2021-01-10
        • 1970-01-01
        • 1970-01-01
        • 2018-04-29
        • 1970-01-01
        • 2020-05-18
        • 2021-06-24
        • 2014-10-03
        • 1970-01-01
        相关资源
        最近更新 更多