【问题标题】:I tried to replace all characters in a string but it's still not working as intended?我试图替换字符串中的所有字符,但它仍然没有按预期工作?
【发布时间】:2020-03-09 22:11:00
【问题描述】:

作为函数的一小部分,此代码旨在将所有“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))

【问题讨论】:

  • 想一想,如果把所有的 G 都换成 C,取结果,然后把所有的 C 换成 G,会发生什么?没错,所有的G先变成C,然后再被第二轮替换,所以你最终得到了所有的G!

标签: python string file replace


【解决方案1】:

你的替补正在与自己作斗争。

您的第一个替换通过并将所有“G”替换为“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))

【讨论】:

    【解决方案2】:

    其他人已经指出了链式.replace 的问题,但有一个内置的translate 字符串函数可以快速轻松地完成这项工作:

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

    输出:

    CCATGCCTAC
    

    参考资料:

    【讨论】:

      【解决方案3】:

      正如 Felix 所说,您必须将其视为两个变量切换问题的扩展案例,其中您使用临时值来保存信息,例如

         a = temp
         a = b
         b = temp
      

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

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

      【讨论】:

        【解决方案4】:

        让我们一步一步地运行你的代码:

        input = GGTACGGATG
        

        用Cs替换所有Gs

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

        现在输入看起来像这样:

        CCTACCCATC
        

        等等!我们还想用 Gs 替换所有 Cs。我们如何知道最初是 G 还是 C?

        这种方法行不通。


        我们第一次替换使用令牌而不是C,最后再用G 替换令牌怎么样?标记应该是文本中没有出现的东西,它可以是一个或多个字符。让我们在这里使用#。它可以是任何东西,真的。

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

        现在输入看起来像这样:

        ##TAC##AT#
        

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

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

        我们得到

        ##TAG##AT#
        

        耶!现在我们没有任何Cs,我们知道Gs 是什么。所以让我们现在替换#

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

        我们得到

        CCTAGCCATC
        

        完成!所有Gs 和Cs 刚刚交换了位置!

        但是我们如何找到输入中绝对没有出现的标记呢? ......我们不能。因此,如果输入来自用户并且可能是任何内容,请不要使用 TOKENS 进行替换。


        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
          }
        }
        

        我会将示例的解释留给你作为练习:)

        【讨论】:

          猜你喜欢
          • 2019-08-01
          • 1970-01-01
          • 2012-10-31
          • 2015-02-22
          • 2018-11-12
          • 2021-10-09
          • 1970-01-01
          • 2012-06-17
          • 1970-01-01
          相关资源
          最近更新 更多