Python:生成具有已知 GC 百分比的随机 DNA 序列
Python: Generate Random DNA Sequencing with Known GC Percent
我正在尝试在 python 中生成 5 个随机 DNA 序列。每个序列的长度为 10,GC 百分比为 0.2。我的理解是该函数会生成第一个随机DNA序列,然后检查它的GC百分比:如果它满足要求(20%,在本例中),它将return序列并重复其他4个序列;如果不满足,它将重新生成序列,直到满足要求并移动到下一个。但目前存在的问题是:1)不会生成5个序列,只会产生1个序列作为输出; 2) returned 序列似乎满足 20% GC 含量的要求,但 10 次中有 8 次,我没有得到任何输出。我是 python 的新手,有人可以帮我解决这个问题吗??
我的代码是:
from random import choice
def DNA_length(length):
DNA = ""
for count in range(length):
DNA += choice ("CGTA")
return DNA
for i in range(5):
DNA = DNA_length(10)
if (DNA.count("G")+DNA.count("C"))/(float(len(DNA)))==0.2:
print(DNA)
谢谢。
如果序列不符合您的要求,您的 if 语句只会通过您的 DNA 序列。
for i in range(5):
DNA = DNA_length(10)
if (DNA.count("G")+DNA.count("C"))/(float(len(DNA)))==0.2:
print(DNA)
只需在您的代码中添加此打印语句可能有助于您的理解。
for i in range(5):
DNA = DNA_length(10)
print(DNA) // added statement
if (DNA.count("G")+DNA.count("C"))/(float(len(DNA)))==0.2:
print(DNA)
以下方法有效。
count = 0
while count < 5:
DNA = DNA_length(10)
if (DNA.count("G")+DNA.count("C"))/(float(len(DNA)))==0.2:
count += 1
print(DNA)
您生成了 5 个序列,但不能保证所有 5 个(甚至只有一个)都符合条件。您需要生成序列,直到获得 5 个满足 'GC' 条件且唯一的序列。
同样更有效的是生成所需数量的随机GC,满足所需的百分比,然后用TA填充其余部分,随机播放和return
from random import choice, shuffle
def generate_dna(length, required, percent):
n = round(percent * length)
fillin = list(set('GCTA') - set(required))
dna = [choice(required) for _ in range(n)]
dna += [choice(fillin) for _ in range(length - n)]
shuffle(dna)
return ''.join(dna)
generated = set()
while len(generated) < 5:
generated.add(generate_dna(10, 'GC', 0.2))
print(generated)
示例输出:
{'AGGAAAAATT', 'TTACAAACTA', 'TCTTAAAGTA', 'TTTATTGGTT', 'ATTGTATTCA'}
请注意,根据 length
和 percent
,并非总能获得所需 GC 的确切数量,因此得出的百分比可能不准确。 10 和 0.2
不是这种情况
基于@buran答案:
import random
def random_seq_gc_per(length, gc_perc):
nb_gc = round(gc_perc*length)
gc_seq = random.choices("GC", k=nb_gc)
at_seq = random.choices("AT", k=length-nb_gc)
dna_seq = gc_seq + at_seq
random.shuffle(dna_seq)
res_dna_seq = ''.join(dna_seq)
return res_dna_seq
for i in range(5):
seq = random_seq_gc_per(10, 0.2)
print(seq)
思路是避免每次都随机生成一个序列,然后计算GC内容,因为是随机的,所以我们不知道是否能得到想要的序列(有GC内容)。
为此:
- 我们首先准确生成 GC 内容
- 然后,我们生成剩余的核苷酸 AT
- 我们把它们连在一起然后洗牌。
注意:这样我们就可以确定得到一个有GC含量的序列。 但是,如果你想用你的方法只生成一个随机序列,然后像你那样统计GC含量(出于某种原因),你可以这样做,你已经接受了@JongHyeon Yeo
给出的答案
我正在尝试在 python 中生成 5 个随机 DNA 序列。每个序列的长度为 10,GC 百分比为 0.2。我的理解是该函数会生成第一个随机DNA序列,然后检查它的GC百分比:如果它满足要求(20%,在本例中),它将return序列并重复其他4个序列;如果不满足,它将重新生成序列,直到满足要求并移动到下一个。但目前存在的问题是:1)不会生成5个序列,只会产生1个序列作为输出; 2) returned 序列似乎满足 20% GC 含量的要求,但 10 次中有 8 次,我没有得到任何输出。我是 python 的新手,有人可以帮我解决这个问题吗??
我的代码是:
from random import choice
def DNA_length(length):
DNA = ""
for count in range(length):
DNA += choice ("CGTA")
return DNA
for i in range(5):
DNA = DNA_length(10)
if (DNA.count("G")+DNA.count("C"))/(float(len(DNA)))==0.2:
print(DNA)
谢谢。
如果序列不符合您的要求,您的 if 语句只会通过您的 DNA 序列。
for i in range(5):
DNA = DNA_length(10)
if (DNA.count("G")+DNA.count("C"))/(float(len(DNA)))==0.2:
print(DNA)
只需在您的代码中添加此打印语句可能有助于您的理解。
for i in range(5):
DNA = DNA_length(10)
print(DNA) // added statement
if (DNA.count("G")+DNA.count("C"))/(float(len(DNA)))==0.2:
print(DNA)
以下方法有效。
count = 0
while count < 5:
DNA = DNA_length(10)
if (DNA.count("G")+DNA.count("C"))/(float(len(DNA)))==0.2:
count += 1
print(DNA)
您生成了 5 个序列,但不能保证所有 5 个(甚至只有一个)都符合条件。您需要生成序列,直到获得 5 个满足 'GC' 条件且唯一的序列。
同样更有效的是生成所需数量的随机GC,满足所需的百分比,然后用TA填充其余部分,随机播放和return
from random import choice, shuffle
def generate_dna(length, required, percent):
n = round(percent * length)
fillin = list(set('GCTA') - set(required))
dna = [choice(required) for _ in range(n)]
dna += [choice(fillin) for _ in range(length - n)]
shuffle(dna)
return ''.join(dna)
generated = set()
while len(generated) < 5:
generated.add(generate_dna(10, 'GC', 0.2))
print(generated)
示例输出:
{'AGGAAAAATT', 'TTACAAACTA', 'TCTTAAAGTA', 'TTTATTGGTT', 'ATTGTATTCA'}
请注意,根据 length
和 percent
,并非总能获得所需 GC 的确切数量,因此得出的百分比可能不准确。 10 和 0.2
基于@buran答案:
import random
def random_seq_gc_per(length, gc_perc):
nb_gc = round(gc_perc*length)
gc_seq = random.choices("GC", k=nb_gc)
at_seq = random.choices("AT", k=length-nb_gc)
dna_seq = gc_seq + at_seq
random.shuffle(dna_seq)
res_dna_seq = ''.join(dna_seq)
return res_dna_seq
for i in range(5):
seq = random_seq_gc_per(10, 0.2)
print(seq)
思路是避免每次都随机生成一个序列,然后计算GC内容,因为是随机的,所以我们不知道是否能得到想要的序列(有GC内容)。 为此:
- 我们首先准确生成 GC 内容
- 然后,我们生成剩余的核苷酸 AT
- 我们把它们连在一起然后洗牌。
注意:这样我们就可以确定得到一个有GC含量的序列。 但是,如果你想用你的方法只生成一个随机序列,然后像你那样统计GC含量(出于某种原因),你可以这样做,你已经接受了@JongHyeon Yeo
给出的答案