我试图测试改变DNA序列中的某些碱基,但我现在编写的方式正在改变同类的所有碱基(即:所有' A' s而不只是改变我想改变的DNA部分内的碱基。
我知道这是因为我设置了替换函数输入,但是我不知道如何根据for循环指定我想要更改的基数 - 无论哪个基都是在每次迭代中的目标。 for循环是我想在该迭代中变异的唯一一个。 这就是我目前所拥有的:
import random
word = 'GTGATCCAGT'
for base in word[5:]:
print base
if base == 'A':
new_base = random.choice('CTG')
print new_base
new_word = word.replace(base, new_base)
print new_word
elif base == 'C':
new_base = random.choice('ATG')
print new_base
new_word = word.replace(base, new_base)
print new_word
elif base == 'G':
new_base = random.choice('CTA')
print new_base
new_word = word.replace(base, new_base)
print new_word
elif base == 'T':
new_base = random.choice('AGC')
print new_base
new_word = word.replace(base, new_base)
print new_word
word = new_word
谢谢!
答案 0 :(得分:1)
您的代码中存在大量重复内容。我建议:
import random
word = list('GTGATCCAGT')
BASES = "ACGT"
for index, base in enumerate(word[:5]):
word[index] = random.choice(BASES.replace(base, ""))
word = "".join(word)
试运行给了我:
>>> word
'TACTACCAGT'
注意切换到list
- Python中的字符串是不可变的,因此您无法(轻松)更改单个字符。相比之下,列表是可变的,因此您可以毫不费力地在给定索引处切换项目。
答案 1 :(得分:0)
循环执行序列时,请确保同时保留索引。此索引将帮助您确定要替换的字符串中的位置。如果要将内容添加到某个位置,只需将该位置的字符串拆分为两个字符串即可。然后通过将新字符串添加到两个字符串的中间来连接新字符串,从而最终得到一个包含正确内容的新字符串。
答案 2 :(得分:0)
您的循环目前没有足够的信息来执行您想要的操作:特别是,它不知道您当前正在查看哪个基础,只知道它的值是什么。您可以使用内置enumerate
来引入该信息,但更简单的方法是更改逻辑,以便每次都不重建字符串 - 而是编写生成器这会为您提供每个连续的new_base
,并在最后将它们全部加入new_word
。它看起来像这样:
def rebase(word):
for base in word:
print base
if base == 'A':
new_base = random.choice('CTG')
print new_base
yield new_base
# etc
else:
# If you didn't change this base, yield the original one
yield base
new_word = word[:5] + ''.join(rebase(word[5:]))
您可能还想使用字典来避免if
s链 - 如下所示:
def rebase(word):
possible_replacements = {'A': 'CTG', 'C': 'ATG'} # etc
for base in word:
print base
try:
yield random.choice(possible_replacements[base])
except KeyError:
# If you didn't change this base, yield the original one
yield base
new_word = word[:5] + ''.join(rebase(word[5:]))