我试图替换字符串中的所有字符,但仍无法按预期工作吗?

时间:2019-11-14 02:30:00

标签: python string file replace

作为函数的较小部分,此代码旨在将所有“ G”替换为“ C”,所有“ T”替换为“ A”,反之亦然,但仍然无法按预期工作,它仅替换了一些实例而不是全部替换。

dna1.txt =“ GGTACGGATG”

file = open('dna1.txt')
            contents = file.read()
            replaced_contents = (contents.replace('G', 'C').replace('T', 'A',)
            .replace('A', 'T').replace('C', 'G'))
            print("Complement: {0}" .format(replaced_contents))

4 个答案:

答案 0 :(得分:2)

您的替补者正在战斗。

您的第一个替换项将全部替换为“ C”:

CCTACCCATC

然后进行第二次替换,并将所有'T'替换为'A':

CCAACCCAAC

然后进行第三次替换,并将所有的“ A”(包括您先前交换为“ A”的“ T”)交换为“ T”:

CCTTCCCTTC

最终替换将所有“ C”(包括您之前交换为“ C”的“ G”)交换为“ G”并将其替换:

GGTTGGGTTG

这可以代替,但是作为免责声明,这是我第一次查看python,这可能不是很多代码!

contents = "GGTACGGATG"
replaced_contents = ""
for c in contents:
  if c == 'G':
    replaced_contents += 'C'
  elif c == 'C':
    replaced_contents += 'G'
  elif c == 'T':
    replaced_contents += 'A'
  elif c == 'A':
    replaced_contents += 'T'
  else:
    replaced_contents += c

print("Complement: {0}" .format(replaced_contents))

输出: Complement: CCATGCCTAC

也可以通过替换词典来做到这一点:

contents = "GGTACGGATG"
replacement = {
  'G':'C',
  'C':'G',
  'T':'A',
  'A':'T'
}
replaced_contents = ""
for c in contents:
    replaced_contents += replacement.get(c) or c

print("Complement: {0}" .format(replaced_contents))

答案 1 :(得分:1)

其他人指出了链式.replace的问题,但是内置了translate字符串内置函数,可以轻松快捷地完成任务:

dna = "GGTACGGATG"
xlat = str.maketrans('GTAC','CATG') # build translation table.
result = dna.translate(xlat)        # translate using table.
print(result)

输出:

CCATGCCTAC

参考文献:

答案 2 :(得分:0)

如Felix所说,您必须将其视为两个变量切换问题的扩展情况,在这种情况下,您使用临时值来保存信息,例如

   a = temp
   a = b
   b = temp

现在,如果我们将其应用于字符串,则需要创建特定的模式来替换第一个字母,例如print('GGTACGGATG'.replace('C','{PH}').replace('G', 'C').replace('{PH}', 'G'))会在C和G之间切换。

请注意,您还必须注意正确验证占位符,使其不包含任何替换的字母。

答案 3 :(得分:0)

让我们逐步运行代码:

input = GGTACGGATG

用Cs替换所有Gs

input = input.replace('G', 'C')

现在输入看起来像这样:

CCTACCCATC

等等!我们还希望将所有C替换为G。我们怎么知道哪些最初是G或C?

这种方法行不通。


我们如何使用令牌而不是C进行第一次替换,然后最后再用G替换令牌?令牌应该是文本中不会出现的东西,并且可以是一个或多个字符。在这里使用#。真的可以是任何东西。

input = input.replace('G', '#')

现在输入看起来像这样:

##TAC##AT#

好的,现在将所有C更改为G

input = input.replace('C', 'G')

我们得到

##TAG##AT#

是的!现在我们没有C了,我们知道G是什么了。因此,让我们现在替换#

input = input.replace('#', 'C')

我们得到

CCTAGCCATC

完成!所有GC都已交换位置!

但是我们如何找到输入中肯定没有出现的令牌? ...我们不能。因此,如果输入来自用户并且可能是任何东西,请不要使用令牌进行替换。


replace方法的作用是逐个字母地遍历字符串,并用新字母替换每个出现的字母。对于下一次替换,我们再次运行此循环。

但是,最通用,最安全的方法将在一个循环中运行,并一次执行所有替换,就像这样:

result = ""
letters_array = input.split('')
for (letter of letters_array) {
  if (letter == 'C') {
    result += 'G'
  } else if (letter == 'G') {
    result += 'C'
  } else {
    result += letter
  }
}

我将对样本的解释留给您练习:)