在循环中使用Python的replace函数
我正在尝试测试在DNA序列中改变某些碱基,但我现在的写法是把所有相同类型的碱基都变了(比如:把所有的'A'都变成'G'),而不是只改变我想要变的那一部分DNA。
我知道这是因为我设置的替换函数输入有问题,但我不太确定如何根据循环来指定我想要改变哪个碱基——在每次循环中,只有目标碱基是我想要在那次循环中变的。
这是我现在的代码:
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
谢谢!
3 个回答
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中,字符串是不可变的,也就是说你不能(很方便地)改变其中的某个字符。相反,列表是可变的,所以你可以很轻松地更改某个位置的内容。
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
判断——像这样:
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:]))