【问题标题】:Most Efficient Way to Replace Multiple Characters in a String [duplicate]替换字符串中多个字符的最有效方法[重复]
【发布时间】:2018-03-28 14:07:04
【问题描述】:

假设有一个任意长度的字符串,它只包含字母 A 到 D:

s1 = 'ACDCADBCDBABDCBDAACDCADCDAB'

用“C”替换每个“B”和用“B”替换每个“C”的最有效/最快的方法是什么。

这就是我现在正在做的事情:

replacedString = ''
for i in s1:
    if i == 'B':
        replacedString += 'C'
    elif i == 'C':
        replacedString += 'B'
    else:
        replacedString += i

这可行,但显然不是很优雅。问题是我正在处理可能是数百万个字符长的字符串,所以我需要一个更好的解决方案。

我想不出用 .replace() 方法来做到这一点。 This 建议也许正则表达式是要走的路。这也适用于这里吗?如果是这样,什么是合适的正则表达式?有没有更快的方法?

谢谢。

【问题讨论】:

  • “重复”问题似乎解决了删除字符而不是替换的问题。
  • 同样的想法,s1.translate(str.maketrans('BC', 'XY'))
  • 是的,我正要告诉你关于 Cyber​​ 标记为重复之前的字符串翻译,但基本上,你不想使用字典,因为你会替换已经替换的值。
  • 如果链接为重复的帖子对您​​没有帮助,请参阅:tutorialspoint.com/python/string_translate.htm
  • “高效”对不同的人可能意味着不同的东西。你只想迭代一次吗?如果您有能力进行多次迭代,请使用str.replace,否则请使用翻译。

标签: python string


【解决方案1】:

除了str.translate 方法之外,您可以简单地构建一个翻译字典并自己运行它。

s1 = 'ACDCADBCDBABDCBDAACDCADCDAB'

def str_translate_method(s1):
    try:
        translationdict = str.maketrans("BC","CB")
    except AttributeError: # python2
        import string
        translationdict = string.maketrans("BC","CB")
    result = s1.translate(translationdict)
    return result

def dict_method(s1):
    from, to = "BC", "CB"
    translationdict = dict(zip(from, to))
    result = ' '.join([translationdict.get(c, c) for c in s1])
    return result

【讨论】:

  • 这与我的回答 here 几乎相同。这个问题可能是个骗子,但由于这个问题有重叠的翻译 (B <--> C),它似乎足以回答。
【解决方案2】:

我想向您展示翻译不当的影响。假设我们有一个类似字符串的 DNA 序列,我们想翻译成 RNA 字符串。一种方法使用不正确的替换,而另一种方法使用字符串连接。

string = 'GGGCCCGCGCCCGGG' # DNA string ready for transcription

替换

替换的问题是已经替换的字母将在未来的迭代中被替换。例如,您可以看到,一旦完成,您将得到一个相同字母的字符串,而不是完全反转。

string = 'GGGCCCGCGCCCGGG'

coding = {'A': 'U', 'T': 'A',
          'G': 'C', 'C': 'G'}

for k, v in coding.items():
    string = string.replace(k, v)

print string

串联

改为使用与不同字符串的字符串连接。因此,您可以保留原始字符串而不会错误地替换。您当然可以使用字符串翻译,但我更喜欢字典,因为根据定义,它们映射值。

string = 'GGGCCCGCGCCCGGG'

coding = {'A': 'U', 'T': 'A',
          'G': 'C', 'C': 'G'}

answer = ''

for char in string:
    answer += coding[char]

print answer

【讨论】:

  • IMO 将其扔进gist 并将其作为评论。同意这不是答案
  • 这是什么意思?
  • 我将为此建议添加一个替代答案。
【解决方案3】:

使用正则表达式,这也可以区分大小写,例如如果必须在字符串中替换的字母为小写,则它将用小写替换字符替换,否则为大写:

import re

chars_map = {'b': 'c', 'c': 'b'} # build a dictionary of replacement characters in lowercase

def rep(match):
    char = match.group(0)
    replacement = chars_map[char.lower()]
    return replacement if char.islower() else replacement.upper()

s = 'AbC'
print re.sub('(?i)%s' % '|'.join(chars_map.keys()), rep, s) # 'AcB'

【讨论】:

    猜你喜欢
    • 2011-12-01
    • 2011-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多