【问题标题】:How do I replace characters in a string using a character map?如何使用字符映射替换字符串中的字符?
【发布时间】:2015-10-23 21:19:31
【问题描述】:

代码用途:

我提供了一个字符串并将其与字典键匹配;如果键和字符串匹配,我打印字典值。

代码如下:

def to_rna(dna_input):
    dna_rna = {'A':'U', 'C':'G', 'G':'C', 'T':'A'}
    rna = []
    for key in dna_rna.iterkeys():
        if key in dna_input:
            rna.append(dna_rna[key])
    print "".join(rna)

to_rna("ACGTGGTCTTAA") #the string input

问题:

结果应该是“UGCACCAGAAUU”,但我得到的只是“UGAC”。问题似乎是我在字符串中有重复的字符,而循环忽略了这一点。如何循环遍历字典,使其返回字典值的次数与找到 dict 键的次数一样多?

【问题讨论】:

  • 循环应该是for char in dna_input,而不是迭代字典的键。
  • 然后附加字符串中出现的每个字符的对应值。
  • 最后,像你一样加入他们。

标签: python dictionary


【解决方案1】:

您可以使用translate()。编辑:我添加了正则表达式以返回 - 错误条目(@jh44tx 似乎是个好主意):

import string
import re
rna_trans = string.maketrans("ACGTU","UGCA-")
rna_trans = re.sub("[^UGCA]","-",rna_trans)
print "ACGTGGTCTTAA".translate(rna_trans)

由于映射是 1:1,您还可以创建反向翻译:

rev_rna_trans = string.maketrans("UGCAT","ACGT-")
rev_rna_trans = re.sub("[^ACGT]","-",rna_trans)

【讨论】:

    【解决方案2】:

    万一您认为有时会收到垃圾信,您可以这样做:

    def to_rna(dna_input):
        dna_rna={'A':'U','C':'G','G':'C','T':'A'}
        rna=[]
        for char in dna_input:
            if char in dna_rna.keys():
                rna.append(dna_rna[char])
            else:
                rna.append('-')
        print "".join(rna)
    
    to_rna("ACGTGGTCTTAAX")
    

    结果是: UGCACCAGAAUU-

    【讨论】:

    • 好好想想垃圾邮件。
    【解决方案3】:

    如果你想为dna_input 中的每个字符输出一个字符,你需要遍历dna_input 中的字符。请注意,get() 函数为字典中没有的字符提供了默认值。我什么都不用替换,如果需要,您可以在此处输入 n 或 X。

    rna.append(dna_rna.get(char, 'n'))
    

    您的代码仅遍历 dna_rna 字典中的 4 个条目。

    def to_rna(dna_input):
        dna_rna = {'A':'U', 'C':'G', 'G':'C', 'T':'A'}
        rna = []
        for char in dna_input:
            rna.append(dna_rna.get(char, ''))
        print "".join(rna)
    
    to_rna("ACGTGGTCTTAA") #the string input
    

    但是,这不是翻译字符串的最有效方式。

    【讨论】:

    • 或使用dna_rna.get(char, '')
    • 这个问题只需要评论,因为正确的迭代是教程中的答案。
    • @MalikBrahimi 一个问题要么值得回答,要么应该被关闭。这个可以回答。作为旁注,连续制作三个 cmets的选择也值得商榷。
    • 谢谢,这解决了问题并且最有意义。我才刚刚开始接触 Python,如果问题很愚蠢,我深表歉意!
    【解决方案4】:

    由于您知道输入的每个字母都会被转换为输出字符串,因此最好对每个字母进行循环:

    def to_rna(dna_input):
        dna_rna = {'A':'U', 'C':'G', 'G':'C', 'T':'A'}
        rna = []
        for x in dna_input:
            rna.append(dna_rna[x])
        return ''.join(rna)
    

    或者你可以用列表推导来编写它

    def to_rna(dna_input):
        dna_rna = {'A':'U', 'C':'G', 'G':'C', 'T':'A'}
        return ''.join([dna_rna[x] for x in dna_input])
    

    【讨论】:

      【解决方案5】:

      您可以将其作为列表理解来执行。因为这变成了单行,所以它几乎使函数变得多余:

      def to_rna(dna_input):
          dna_rna = {'A':'U', 'C':'G', 'G':'C', 'T':'A'}
          return "".join([dna_rna.get(x, '') for x in dna_input])
      

      【讨论】:

        猜你喜欢
        • 2012-04-26
        • 1970-01-01
        • 2021-09-23
        • 2018-09-11
        • 2011-12-04
        • 2021-04-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多