替换字符串中两个字符的pythonic方法
pythonic way to replace two character in a string
我有一个字符串,例如 s = "-1+2-3"
我想将所有 -
替换为 +
并将所有 +
替换为 -
.
我期望的是 s = +1-2+3
。所以我不能只使用 s.replace('-','+').replace('+','-')
,因为它 return s=-1-2-3
,也许 for 循环可以提供帮助。但我想知道是否有 pythonic 方法可以这样做?
thanks for all solutions i did a simple test for all function below
def a(s="-1+2-3"):
s = re.sub('[+-]', lambda match: '-' if match[0] == '+' else '+', s)
return s
def b(s="-1+2-3"):
PLUS = '+'
MINUS = '-'
swap = {ord(PLUS): ord(MINUS), ord(MINUS): ord(PLUS)}
s = s.translate(swap)
return s
def c(s="-1+2-3"):
replacements = {"+": "-", "-": "+"}
return ''.join([replacements[i] if i in replacements.keys() else i for i in s])
def d(s="-1+2-3"):
return s.replace('+', '\x01').replace('-', '+').replace('\x01', '-')
if __name__ == '__main__':
a = timeit.timeit(a, number=100000) # a=0.20307550000000002
b = timeit.timeit(b, number=100000) # b=0.08596850000000006
c = timeit.timeit(c, number=100000) # c=0.12203799999999998
d = timeit.timeit(d, number=100000) # d=0.033226100000000036
print(f"{a=}\n{b=}\n{c=}\n{d=}\n")
您可以使用字典和循环,因此您可以在字典中进行任意数量的替换。
s = "-1+2-3"
replacements = {"+":"-", "-":"+"}
s = ''.join([replacements[i] if i in replacements.keys() else i for i in s])
'+1-2+3'
您可以使用翻译(没有 Barmar 指出的 ord
):
s = "-1+2-3"
s.translate(str.maketrans('-+', '+-'))
输出:
'+1-2+3'
你应该试试:
s=s.replace('+','\x01').replace('-','+').replace('\x01','-')
它将所有的'+'替换为未使用的字符,然后将'-'替换为'+',然后将“未使用的字符”替换为'-',有效地交换'+'和'-' .
您可以使用 re.sub()
.
import re
s = "-1+2-3"
s = re.sub('[+-]', lambda match: '-' if match[0] == '+' else '+', s)
很多人已经回答了你,所以我使用 map()
功能添加这个例子来完整性:
def replaceSymbol(s):
res = s;
if '+' in s:
res = '-'
elif '-' in s:
res = '+'
return res
''.join(map(replaceSymbol, "-1+2-3"))
输出:
+1-2+3
我有一个字符串,例如 s = "-1+2-3"
我想将所有 -
替换为 +
并将所有 +
替换为 -
.
我期望的是 s = +1-2+3
。所以我不能只使用 s.replace('-','+').replace('+','-')
,因为它 return s=-1-2-3
,也许 for 循环可以提供帮助。但我想知道是否有 pythonic 方法可以这样做?
thanks for all solutions i did a simple test for all function below
def a(s="-1+2-3"):
s = re.sub('[+-]', lambda match: '-' if match[0] == '+' else '+', s)
return s
def b(s="-1+2-3"):
PLUS = '+'
MINUS = '-'
swap = {ord(PLUS): ord(MINUS), ord(MINUS): ord(PLUS)}
s = s.translate(swap)
return s
def c(s="-1+2-3"):
replacements = {"+": "-", "-": "+"}
return ''.join([replacements[i] if i in replacements.keys() else i for i in s])
def d(s="-1+2-3"):
return s.replace('+', '\x01').replace('-', '+').replace('\x01', '-')
if __name__ == '__main__':
a = timeit.timeit(a, number=100000) # a=0.20307550000000002
b = timeit.timeit(b, number=100000) # b=0.08596850000000006
c = timeit.timeit(c, number=100000) # c=0.12203799999999998
d = timeit.timeit(d, number=100000) # d=0.033226100000000036
print(f"{a=}\n{b=}\n{c=}\n{d=}\n")
您可以使用字典和循环,因此您可以在字典中进行任意数量的替换。
s = "-1+2-3"
replacements = {"+":"-", "-":"+"}
s = ''.join([replacements[i] if i in replacements.keys() else i for i in s])
'+1-2+3'
您可以使用翻译(没有 Barmar 指出的 ord
):
s = "-1+2-3"
s.translate(str.maketrans('-+', '+-'))
输出:
'+1-2+3'
你应该试试:
s=s.replace('+','\x01').replace('-','+').replace('\x01','-')
它将所有的'+'替换为未使用的字符,然后将'-'替换为'+',然后将“未使用的字符”替换为'-',有效地交换'+'和'-' .
您可以使用 re.sub()
.
import re
s = "-1+2-3"
s = re.sub('[+-]', lambda match: '-' if match[0] == '+' else '+', s)
很多人已经回答了你,所以我使用 map()
功能添加这个例子来完整性:
def replaceSymbol(s):
res = s;
if '+' in s:
res = '-'
elif '-' in s:
res = '+'
return res
''.join(map(replaceSymbol, "-1+2-3"))
输出:
+1-2+3