【发布时间】:2014-07-30 04:09:55
【问题描述】:
我想输入一个 DNA 序列并制作某种生成器,该生成器会产生具有一定突变频率的序列。例如,假设我有 DNA 链“ATGTCGTCACACACCGCAGATCCGTGTTTGAC”,我想创建 T->A 频率为 5% 的突变。我将如何去创造这个?我知道可以使用这样的代码来创建随机突变:
import random
def mutate(string, mutation, threshold):
dna = list(string)
for index, char in enumerate(dna):
if char in mutation:
if random.random() < threshold:
dna[index] = mutation[char]
return ''.join(dna)
但我真的不知道该怎么做是固定突变频率。有人知道该怎么做吗?谢谢。
编辑:
如果我使用字节数组,格式应该是这样的,因为我收到了一个错误:
import random
dna = "ATGTCGTACGTTTGACGTAGAG"
def mutate(dna, mutation, threshold):
dna = bytearray(dna) #if you don't want to modify the original
for index in range(len(dna)):
if dna[index] in mutation and random.random() < threshold:
dna[index] = mutation[char]
return dna
变异(DNA,{“A”:“T”},0.05) print("我现在的 dna:", dna)
错误:“TypeError:没有编码的字符串参数”
编辑 2:
import random
myDNA = bytearray("ATGTCGTCACACACCGCAGATCCGTGTTTGAC")
def mutate(dna, mutation, threshold):
dna = myDNA # if you don't want to modify the original
for index in range(len(dna)):
if dna[index] in mutation and random.random() < threshold:
dna[index] = mutation[char]
return dna
mutate(dna, {"A": "T"}, 0.05)
print("my dna now:", dna)
产生错误
【问题讨论】:
-
谢谢。如果我要使用字节数组,我是将字符串转换成那个还是什么?我并不完全熟悉它。
-
对不起,这里有 3 个解决方案:要么使用
dna = bytearray(b"ATGTCGTACGTTTGACGTAGAG"),要么将dna = bytearray(dna)更改为dna = bytearray(dna, "ascii")(这需要 mutate 的第一个参数是字符串),或者你只使用你的函数 mutate 的代码(这也可以),其余部分保持不变。 -
你的第二次编辑有几个方面是错误的:无法创建myDNA,因为如果你想创建一个字节数组,你必须使用字节或带有编码的字符串,所以
bytearray(b"...")或@987654328 @。dna = myDNA这一行也是有问题的。该函数接收参数 dna,因此为了不使用传递给函数的原始数据,您可以使用原始副本覆盖 dna(指原始数据),因此请编写dna = bytearray(dna)。 for循环有几个错误,都是我做的,所以复制我更新的代码。 -
函数调用使用
dna作为参数,但是你从未定义dna,使用newDNA = mutate(myDNA, {"A": "T"}, 0.05),来存储结果。要打印结果,请将其转换为字符串:print("My DNA now:", newDNA.decode("ascii"))