【问题标题】:Pythonic way to replace charsPythonic 替换字符的方法
【发布时间】:2019-07-21 21:59:41
【问题描述】:

我想用pythonic方法替换字符串中的一些字符。

A -> T
C -> G
G -> C
T -> A

例子:

AAATCGATTGAT

会变成

TTTAGCTAACTA

我做了什么:

def swap(string):
    string = re.sub('A', 'aux', string)
    string = re.sub('T', 'A', string)
    string = re.sub('aux', 'T', string)
    string = re.sub('C', 'aux', string)
    string = re.sub('G', 'C', string)
    string = re.sub('aux', 'G', string)

    return string

效果很好,但我正在寻找一种更 Pythonic 的方式来实现它。

【问题讨论】:

    标签: python replace character-replacement


    【解决方案1】:

    使用带有理解和str.join的字典:

    translateDict = {
      "A" : "T",
      "C" : "G",
      "G" : "C",
      "T" : "A"
    }
    
    s1 = "AAATCGATTGAT"
    reconstructed = "".join(translateDict.get(s, s) for s in s1)
    

    这里有live example

    注意dict.get的使用;万一字母不在字典中,我们就让它保持原样。

    正如@bravosierra99 所建议的,您也可以简单地使用str.translate

    reconstructed = s1.translate(string.maketrans(translateDict))
    

    【讨论】:

    • 感谢您的回答。这就是我要寻找的
    • 如果你要做翻译,那么你应该做的很好。 programiz.com/python-programming/methods/string/translate
    • @bravosierra99 您的链接在移动设备上无法阅读(屏幕外带有关闭按钮的大广告)。也许链接到官方文档或相关的 Stack Overflow 问题?
    • @tripleee,答案中有官方文档的链接;)
    【解决方案2】:

    这是当前接受的- Chepner's deleted 答案的重构,它只调用一次maketrans

    tt = str.maketrans({"A":"T", "C":"G", "G":"C", "T": "A"})
    for s1 in "AGACAT", "TAGGAC", "ACTAGAA":
        print(s1.translate(tt))
    

    也许还指出您可以将结果从replace 链接起来,尽管这仍然很笨拙且效率低:

    def acgtgca(s1):
        return s1.replace(
            "A", "\ue0fa").replace(
            "G", "\ue0fb").replace(
            "C", "G").replace(
            "T", "A").replace(
            "\ue0fb", "C").replace(
            "\ue0fa", "T")
    

    这避免了使用“aux”作为特殊标记来支持 Unicode Private Use Area 之外的两个任意字符。

    但同样,maketrans 方法更简洁、更高效。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-09-25
    • 2020-10-05
    • 1970-01-01
    • 2012-05-03
    • 1970-01-01
    相关资源
    最近更新 更多