在循环中使用Python的replace函数

0 投票
3 回答
517 浏览
提问于 2025-04-18 12:46

我正在尝试测试在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:]))

撰写回答