python - 如何扩展不明确的 DNA 序列

标签 python biopython dna-sequence

假设您有这样的 DNA 序列:

AATCRVTAA

其中 RV 是 DNA 核苷酸的模糊值,其中 R 代表 AGV代表ACG

是否有一种 Biopython 方法可以生成可以由上述模糊序列表示的所有不同序列组合?

例如,输出为:

AATCAATAA
AATCACTAA
AATCAGTAA
AATCGATAA
AATCGCTAA
AATCGGTAA

最佳答案

也许是一种更短更快的方法,因为无论如何这个函数将用于非常大的数据:

from Bio import Seq
from itertools import product

def extend_ambiguous_dna(seq):
   """return list of all possible sequences given an ambiguous DNA input"""
   d = Seq.IUPAC.IUPACData.ambiguous_dna_values
   return [ list(map("".join, product(*map(d.get, seq)))) ]

使用 map 允许您的循环在 C 中执行,而不是在 Python 中执行。事实证明,这比使用普通循环甚至列表理解要快得多。

现场测试

用一个简单的字典作为 d 而不是 ambiguous_na_values 返回的字典

from itertools import product
import time

d = { "N": ["A", "G", "T", "C"], "R": ["C", "A", "T", "G"] }
seq = "RNRN"

# using list comprehensions
lst_start = time.time()
[ "".join(i) for i in product(*[ d[j] for j in seq ]) ]
lst_end = time.time()

# using map
map_start = time.time()
[ list(map("".join, product(*map(d.get, seq)))) ]
map_end = time.time()

lst_delay = (lst_end - lst_start) * 1000
map_delay = (map_end - map_start) * 1000

print("List delay: {} ms".format(round(lst_delay, 2)))
print("Map delay: {} ms".format(round(map_delay, 2)))

输出:

# len(seq) = 2:
List delay: 0.02 ms
Map delay: 0.01 ms

# len(seq) = 3:
List delay: 0.04 ms
Map delay: 0.02 ms

# len(seq) = 4
List delay: 0.08 ms
Map delay: 0.06 ms

# len(seq) = 5
List delay: 0.43 ms
Map delay: 0.17 ms

# len(seq) = 10
List delay: 126.68 ms
Map delay: 77.15 ms

# len(seq) = 12
List delay: 1887.53 ms
Map delay: 1320.49 ms

很明显,map 更好,但只有 2 或 3 倍。可以肯定的是,它可以进一步优化。

关于python - 如何扩展不明确的 DNA 序列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27551921/

相关文章:

c - 使用 C 代码难以读取 DNA 序列文件

python - 在 while 循环中使用 tqdm 进度条

python - 替换 FASTA 比对文件列中字母的所有实例

Python; DNA 序列到 AscII 文本

python - 将距离矩阵转换为 Newick 格式

biopython - 如何连接由 Bio.SeqIO.index 创建的两个或多个字典?

wolfram-mathematica - DNA序列的混沌游戏

python:拆分字符串而不丢弃任何内容

python - 如何在链接的 docker 容器上运行命令?

python - PyTesseract 不工作