【问题标题】:how to find a three letter in a sequence?如何在序列中找到三个字母?
【发布时间】:2015-02-12 15:31:28
【问题描述】:

我有一个序列如下:

my_file_m= "TCCATTCTCTACCCAGCCCCCACTCTGACCCCTTTACTCTGACCCCTTTATTGTCTACTCCTCAGAGCCCCCAGTCTGTA
TCCTTCTAACTTAGAAAGGGGATTATGGCTCAGGGTCCAACTCTGTGCTCAGAGCTTTCAACAACTACTCAGAAACACAA
GATGCTGGGACAGTGACCTGGACTGTGGGCCTCTCATGCACCACCATCAAGGACTCAAATGGGCTTTCCGAATTCACTGG
AGCCTCGAATGTCCATTCCTGAGTTCTGCAAAGGGAGAGTGGTCAGGTTGCCTCTGTCTCAGAATGAGGCTGGATAAGAT"

我想找出具体的三个字母 TAATGATAG 的位置和数量。如果有的话,我想给它们上色。

我从加载字母开始

my_file = open(my_file_m)
mine = my_file.read()
print(mine)

我不能使用 .count 也不能​​使用 find,因为我有三个输入。有什么想法如何找到它们并突出显示它们吗?

【问题讨论】:

  • "[我不能] 使用 find,因为我有三个输入"。只需调用find 三次,每次输入一次。
  • 对每个单词使用正则表达式将字符串拆分三次。您想要的输出将是每个拆分字符串的长度 - 1(对于您用于拆分的各个单词)。
  • @nemo 你可以使用函数 searchString($val, 3)
  • @akrun 我觉得自己很愚蠢,几秒钟内我收到了超过 8 cmets!我认为这个问题非常愚蠢,人们从未遇到过!但如果你认为这是可以的问题,我可以再问一次
  • 我把这个作为面试问题在白板上解决

标签: python


【解决方案1】:

这是我对您问题的解决方案:

注意:此代码还可以查找重叠序列。根据您是否要允许重叠,您必须删除 '?='

import re 

class bcolors:
    HEADER = '\033[95m'
    OKBLUE = '\033[94m'
    OKGREEN = '\033[92m'
    WARNING = '\033[93m'
    FAIL = '\033[91m'
    ENDC = '\033[0m'
    BOLD = '\033[1m'
    UNDERLINE = '\033[4m'

my_file_m= '''TTCCATTCTCTACCCAGCCCCCACTCTGACCCCTTTACTCTGACCCCTTTATTGTCTACTCCTCAGAGCCCCCAGTCTGTATCCTTCTAACTTAGAAAGGGGATTATGGCTCAGGGTCCAACTCTGTGCTCAGAGCTTTCAACAACTACTCAGAAACACAAGATGCTGGGACAGTGACCTGGACTGTGGGCCTCTCATGCACCACCATCAAGGACTCAAATGGGCTTTCCGAATTCACTGGAGCCTCGAATGTCCATTCCTGAGTTCTGCAAAGGGAGAGTGGTCAGGTTGCCTCTGTCTCAGAATGAGGCTGGATAAGAT'''


pat = re.compile(r'(?=(TAA|AAT|TGA|TAG))') # Very important, if you do not need overlaps then remove '?='
matches = re.finditer(pat,my_file_m)
result1 = [int(match.start(1)) for match in matches] # find all the starting positions of the string
result2 = [range(x,x+3) for x in result1 ] # find all the positions of the characters (given that we search for patterns of length 3, can be modified for other lengths too )
result3 = set().union(*result2) # generate a union

for chari in range(len(my_file_m)): # colorize based on if it is in a sequence or not
    if(chari in result3):
        print bcolors.OKGREEN + my_file_m[chari]  + bcolors.ENDC,
    else:
        print my_file_m[chari],

清洁工:

import re 
import sys

my_file_m= '''TAATTCCATTCTCTACCCAGCCCCCACTCTGACCCCTTTACTCTGACCCCTTTATTGTCTACTCCTCAGAGCCCCCAGTCTGTATCCTTCTAACTTAGAAAGGGGATTATGGCTCAGGGTCCAACTCTGTGCTCAGAGCTTTCAACAACTACTCAGAAACACAAGATGCTGGGACAGTGACCTGGACTGTGGGCCTCTCATGCACCACCATCAAGGACTCAAATGGGCTTTCCGAATTCACTGGAGCCTCGAATGTCCATTCCTGAGTTCTGCAAAGGGAGAGTGGTCAGGTTGCCTCTGTCTCAGAATGAGGCTGGATAAGAT'''

pat = re.compile(r'(?=(TAA|TGA|TAG))') # Very important, if you do not need overlaps then remove '?='
lettersToColor = set().union(*[range(m.start(1),m.start(1)+3) for m in re.finditer(pat, my_file_m)])

for chari in range(len(my_file_m)): # colorize based on if it is in a sequence or not
    if(chari in lettersToColor):
        sys.stdout.write('\033[92m' + my_file_m[chari]  +'\033[0m')
    else:
        sys.stdout.write(my_file_m[chari])

归功于:herehere

输出:

【讨论】:

    【解决方案2】:

    使用标准库中的re.findall 函数和collection.Counter

    import re
    from collections import Counter
    
    pat = re.compile(r"(TAA|TGA|TAG)")
    c = re.findall(pat,my_file_m)
    
    print(c)
    print(Counter(c))
    

    输出

    ['TGA', 'TGA', 'TAA', 'TAG', 'TGA', 'TGA', 'TGA', 'TAA']
    Counter({'TGA': 5, 'TAA': 2, 'TAG': 1})
    

    【讨论】:

      【解决方案3】:

      您是否需要将 DNA 序列每三个字母分开来绘制遗传密码?

      如果有,请看下面的代码。

      my_file_m= '''TCCATTCTCTACCCAGCCCCCACTCTGACCCCTTTACTCTGACCCCTTTATTGTCTACTCCTCAGAGCCCCCAGTCTGTA
      TCCTTCTAACTTAGAAAGGGGATTATGGCTCAGGGTCCAACTCTGTGCTCAGAGCTTTCAACAACTACTCAGAAACACAA
      GATGCTGGGACAGTGACCTGGACTGTGGGCCTCTCATGCACCACCATCAAGGACTCAAATGGGCTTTCCGAATTCACTGG
      AGCCTCGAATGTCCATTCCTGAGTTCTGCAAAGGGAGAGTGGTCAGGTTGCCTCTGTCTCAGAATGAGGCTGGATAAGAT'''
      
      mm = "".join(my_file_m.split())                 # delete the new line characters
      
      messenger = map(''.join, zip(*[iter(mm)]*3))    # split every three letters
      
      print messenger.count('TAA')
      print messenger.count('TGA')
      print messenger.count('TAG')
      

      输出

      0
      1
      0
      

      【讨论】:

      • 感谢@Aaron,您使用的命令似乎很有趣,感谢您的评论,我已经喜欢它了;-) 但是,您为什么使用 .split ?您是否尝试删除 '''' 字符?
      • 其实前三行末尾有一个\n字符。 \n 表示换行。我使用split 删除换行符。
      • 如果要查找'TAA'的位置,可以import re [m.start(0) for m in re.finditer("TAA", my_file_m)] 会显示'TAA'出现的索引。
      猜你喜欢
      • 2020-08-19
      • 2014-11-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多