假设有一个任意长度的字符串,它只包含字母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表明也许正则表达式是可行的。这也适用吗?如果是这样,什么是合适的正则表达式?还有更快的方法吗?
谢谢。
答案 0 :(得分:3)
我想向您展示不正确翻译的效果。让我们假装我们有一个像字符串一样的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
答案 1 :(得分:2)
除了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
答案 2 :(得分:0)
使用正则表达式,它也可以处理区分大小写,例如如果必须在字符串中替换的字母是小写的,那么它将用小写替换字符替换它大写:
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'