-1
from random import randint

def replace_base_randomly_using_names(base_seq):
    """Return a sequence with the base at a randomly selected position of base_seq
    replaced by a base chosen randomly from the three bases that are not at that
    position."""
    position = randint(0, len(base_seq) - 1) # −1 because len is one past end
    base = base_seq[position]
    bases = 'TCAG'
    bases.replace(base, '') # replace with empty string!
    newbase = bases[randint(0,2)]
    beginning = base_seq[0:position] # up to position
    end = base_seq[position+1:] # omitting the base at position
    return beginning + newbase + end

这应该模拟一个突变。正如文档类型所提到的,我不明白如何选择不同的基础(来自 TCAG 内部)以确保确实改变了基础。

编辑:

执行相同操作的上述代码的另一个版本:

def replace_base_randomly(base_seq):
    position = randint(0, len(base_seq) - 1)
    bases = 'TCAG'.replace(base_seq[position], '')
    return (base_seq[0:position] +
            bases [randint(0,2)] +
            base_seq[position+1:])

需要明确的是,我的问题是如何用不同的基地替换基地?

4

3 回答 3

1

考虑将打印语句交错到代码中,您可以看到它在做什么。这是算法:

  • 在字符串中选择一个随机索引。将其保存为“位置”。
  • 将该索引处的字符保存为“base”。
  • 在列表“TCAG”中,将字符“base”替换为空字符串,并将该列表保存为“bases”(因此它将包含不是索引“position”处的每个碱基)。
  • 从“bases”中选择一个随机字符并将该字符保存为“newbase”。(所以它会是移除你最初随机选择的碱基后剩下的三个碱基之一。)
  • 返回三个字符串的连接:原始字符串直到但不包括“position”、“newbase”,以及原始字符串跟随但不包括“newbase”。

它不编辑字符串——它从旧字符串的两段加上新的基数创建一个新字符串,然后返回它。

于 2013-07-08T22:46:43.283 回答
0

该行bases.replace(base, '')实际上并没有更改bases字符串。要更改bases字符串,您必须设置bases = bases.replace(base, ''). 自己测试一下

bases = 'ACGT'
base = 'A'
print bases #prints 'ACGT'
bases.replace(base, '')
print bases #prints 'ACGT'
bases = bases.replace(base, '')
print bases #prints 'CGT'

从这里开始,现在可能的碱基列表已经减少到只有突变的碱基,该函数随机选择一个碱基bases[randint(0, 2)]并将其附加到新序列中。

于 2013-07-08T21:54:14.057 回答
0

字符串在 python 中是不可变的,你应该重新分配从bases.replace(base, '')to返回的字符串bases

bases = bases.replace(base, '')
于 2013-07-08T21:15:46.737 回答