在for循环中使用python替换函数

时间:2014-07-10 10:26:19

标签: python for-loop replace indexing

我试图测试改变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

谢谢!

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中的字符串是不可变的,因此您无法(轻松)更改单个字符。相比之下,列表是可变的,因此您可以毫不费力地在给定索引处切换项目。

答案 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:]))