Pythonic 替换字符的方法

Posted

技术标签:

【中文标题】Pythonic 替换字符的方法【英文标题】:Pythonic way to replace chars 【发布时间】: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 的方式来实现它。

【问题讨论】:

【参考方案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 方法更简洁、更高效。

【讨论】:

也许另见***.com/questions/2484156/…,它有一个很好的选择,使用reduce

以上是关于Pythonic 替换字符的方法的主要内容,如果未能解决你的问题,请参考以下文章

用NumPy数组中的```[i,i,i]```快速替换元素i的pythonic方法?

交错两个字符串的最pythonic方法

Pythonic 列表转字符串方法

枚举的pythonic替换[重复]

删除函数内容的 Pythonic 方法

用模拟函数替换真实返回值和函数实现的 Pythonic 方式