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'}

请注意,根据 lengthpercent,并非总能获得所需 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

给出的答案