如何使用 Python 替换字符串中的成对字符
how to replace pairwise characters in a string using Python
假设我有一个字符串:
x="AAAABBABAABCCABBCA"
我有以下信息:
AAA=1
ABB= ignore/remove from final output
ABA=2
ABC=3
CAB=4
BCA= ignore/remove from final output
所以当我翻译 x
时,输出 y
应该是:
y=1234
我试过了:
def fun(x):
x=x.replace("AAA","1")
x=x.replace("ABA","2")
x=x.replace("ABB","")
x=x.replace("ABC","3")
x=x.replace("BCA","")
x=x.replace("CAB","4")
print x
但它给了我错误的答案:123CCA
我也试过:
def fun(x):
z=[]
for i in range(0,(len(x)+1)):
if i=="AAA":
i=i.replace("AAA",1)
z.append(i)
elif i=="ABA":
i=i.replace("ABA",2)
elif i=="ABB":
i=i.replace("ABB","")
elif i=="ABC":
i=i.replace("ABC",3)
elif i=="BCA":
i=i.replace("BCA","")
elif i=="CAB":
i=i.replace("CAB","4")
z.append(i)
print ",".join(z)
但是语法有问题。
所以主要问题是从头开始检查字符串并替换字符。
请帮助我。
谢谢
这是一个解决方案,可以在 运行 超过您的字符串时正确打印 1234
:
x = "AAAABBABAABCCABBCA"
newstr = ''
for i in range(0,len(x),3):
part = x[i:i + 3]
if part == 'AAA':
newstr += '1'
elif part == 'ABA':
newstr += '2'
elif part == 'ABC':
newstr += '3'
elif part == 'CAB':
newstr += '4'
print newstr
如果三个字符的序列没有做任何事情,让它检查它就没有多大意义;静静地继续下一个。
如果您决定使用 str.replace
替换代码中的这些字符串,您应该查看可选的第三个参数 count
。如果您将它限制为每个循环的单个替换,您应该会达到您想要的结果。
作为一种 pythonic 方式,您可以使用 grouper function 根据特定长度对字符串进行分组,并将您的模式放入字典中:
>>> d ={'ABA': '2', 'ABB': '', 'ABC': '3', 'AAA': '1', 'BCA': '', 'CAB': '4'}
>>> def grouper(iterable, n, fillvalue=None):
... "Collect data into fixed-length chunks or blocks"
... # grouper('ABCDEFG', 3, 'x') --> ABC DEF Gxx
... args = [iter(iterable)] * n
... return izip_longest(fillvalue=fillvalue, *args)
...
>>> from itertools import izip_longest
>>> ''.join([d.get(''.join(i),'') for i in grouper(x,3)])
'1234'
您应该使用 dict
来存储您的规则,这样您就不必在每次规则更改时都更新代码。您可以简单地更新规则字典,您的函数应该继续工作。
rules = {'AAA': '1',
'ABB': '',
'ABA': '2',
'ABC': '3',
'CAB': '4',
'BCA': ''}
def fun(str, rules=rules, substr_length=3):
newstr = []
for i in range(0, len(str), substr_length):
substr = str[i:i+substr_length]
newstr.append(rules[substr])
return ''.join(newstr)
print fun("AAAABBABAABCCABBCA")
假设我有一个字符串:
x="AAAABBABAABCCABBCA"
我有以下信息:
AAA=1
ABB= ignore/remove from final output
ABA=2
ABC=3
CAB=4
BCA= ignore/remove from final output
所以当我翻译 x
时,输出 y
应该是:
y=1234
我试过了:
def fun(x):
x=x.replace("AAA","1")
x=x.replace("ABA","2")
x=x.replace("ABB","")
x=x.replace("ABC","3")
x=x.replace("BCA","")
x=x.replace("CAB","4")
print x
但它给了我错误的答案:123CCA
我也试过:
def fun(x):
z=[]
for i in range(0,(len(x)+1)):
if i=="AAA":
i=i.replace("AAA",1)
z.append(i)
elif i=="ABA":
i=i.replace("ABA",2)
elif i=="ABB":
i=i.replace("ABB","")
elif i=="ABC":
i=i.replace("ABC",3)
elif i=="BCA":
i=i.replace("BCA","")
elif i=="CAB":
i=i.replace("CAB","4")
z.append(i)
print ",".join(z)
但是语法有问题。
所以主要问题是从头开始检查字符串并替换字符。 请帮助我。
谢谢
这是一个解决方案,可以在 运行 超过您的字符串时正确打印 1234
:
x = "AAAABBABAABCCABBCA"
newstr = ''
for i in range(0,len(x),3):
part = x[i:i + 3]
if part == 'AAA':
newstr += '1'
elif part == 'ABA':
newstr += '2'
elif part == 'ABC':
newstr += '3'
elif part == 'CAB':
newstr += '4'
print newstr
如果三个字符的序列没有做任何事情,让它检查它就没有多大意义;静静地继续下一个。
如果您决定使用 str.replace
替换代码中的这些字符串,您应该查看可选的第三个参数 count
。如果您将它限制为每个循环的单个替换,您应该会达到您想要的结果。
作为一种 pythonic 方式,您可以使用 grouper function 根据特定长度对字符串进行分组,并将您的模式放入字典中:
>>> d ={'ABA': '2', 'ABB': '', 'ABC': '3', 'AAA': '1', 'BCA': '', 'CAB': '4'}
>>> def grouper(iterable, n, fillvalue=None):
... "Collect data into fixed-length chunks or blocks"
... # grouper('ABCDEFG', 3, 'x') --> ABC DEF Gxx
... args = [iter(iterable)] * n
... return izip_longest(fillvalue=fillvalue, *args)
...
>>> from itertools import izip_longest
>>> ''.join([d.get(''.join(i),'') for i in grouper(x,3)])
'1234'
您应该使用 dict
来存储您的规则,这样您就不必在每次规则更改时都更新代码。您可以简单地更新规则字典,您的函数应该继续工作。
rules = {'AAA': '1',
'ABB': '',
'ABA': '2',
'ABC': '3',
'CAB': '4',
'BCA': ''}
def fun(str, rules=rules, substr_length=3):
newstr = []
for i in range(0, len(str), substr_length):
substr = str[i:i+substr_length]
newstr.append(rules[substr])
return ''.join(newstr)
print fun("AAAABBABAABCCABBCA")