【问题标题】:How do I screen DNA sequences for certain base orders and get their position?我如何筛选特定碱基顺序的 DNA 序列并获得它们的位置?
【发布时间】:2019-12-18 14:15:02
【问题描述】:

我正在尝试在包含 dna 代码的列表中查找特定序列(字母已转换为数字,例如 A=1,T=4)。

例如:

dna = [1,4,3,2,3,2,1,2,3,2,4,2,1,2,2,2,2,4,1,3,4]

查看前 3 个项目 (1,4,3) 并检查项目是否为 2,2,4。如果为 True,则获取位置(在此 0、1、2 中为 False)。否则查看接下来的 3 个项目 2,3,2 并重复。对 dna [] 中的所有位置执行此操作

我的方法是一个 for i in range 循环,它应该给我位置 dna[15,16,17] 但它不会...


A,G,C,U = 1,2,3,4

dna = []

for _ in range(200): #just generated random 200 numbers as example dna
    code = random.randrange(1,5,1)
    dna.append(code)

l = int(len(dna)/3) #splits search into 3

for i in range(l):
    k = i*3
    if dna[k] == 2:
        if dna[k+1] == 2:
            if dna[k+2] == 4:
                m += 1
                print('GGU at:', dna[i], dna[i+1], dna[k+2], 'found:', m)

我从 SOF 上的类似问题中尝试了很多不同的想法,但大多数人都不关心数字的顺序......有时伪位置是项目 2、2、4,有时它不会找到任何比赛。 我们将不胜感激!

【问题讨论】:

  • 224 可以出现在不是 3 的倍数的位置
  • Related。关于这个问题有大量文献;如果您这样做不是为了好玩,您可能会更好地使用现有工具之一。
  • 另一个快速的解决方案是将dna 和子模式转换为strings 并运行re.finall。如果您只测试少数几种模式,这将非常有效。
  • 如果您仍需要帮助,我可以回复other question

标签: python python-3.x list


【解决方案1】:

使用某种生成器将代码分成长度为 3 的块,并在 for 循环中与 [2,2,4] 进行比较

import random
A,G,C,U = 1,2,3,4

dna = []

for _ in range(200): #just generated random 200 numbers as example DNA
    code = random.randrange(1,5,1)
    dna.append(code)
#function to split list into chunks
def get_chunks(li, cols=2):
    start = 0
    for i in range(cols):
        stop = start + len(li[i::cols])
        yield li[start:stop]
        start = stop
#calculate the required amount of chunks
chunk_amount = int(len(dna)/3)
#create a generator that returns the chunks
chunk_generator = get_chunks(dna, chunk_amount)
#write the chunks to a list named chunks
chunks = []
for x in chunk_generator:
    chunks.append(x)

#iterate the chunks to find a match
j = 0
for i in chunks:
    if i == [2, 2, 4]: #was the sequence found?
        print("2, 2, 4 located at " + str(j) + ", " + str(j+1) + ", " + str(j+2))
    j += 3

该程序在随机 DNA 中查找所有 [2,2,4] 实例。 当然,如果不存在[2,2,4] 序列,它不会打印任何内容

【讨论】:

  • 非常感谢!这已经很有帮助了!我不确定该位置目前试图告诉我什么(什么 + str(j) + str(j+1) + str(j+0) 实际输出)。您能否@Jake 进一步详细说明这一点?太感谢了!它打印:2, 2, 4 located at 818281 2, 2, 4 located at 135136135 2, 2, 4 located at 153154153
  • 已修复。我做了一些草率的编码,只是连接了接下来的 3 个值,而不注意格式
  • 非常感谢杰克!!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多