如何使用Python替换字符串中的成对字符
假设我有一个字符串:如何使用Python替换字符串中的成对字符,python,python-2.7,dynamic-programming,Python,Python 2.7,Dynamic Programming,假设我有一个字符串: 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.rep
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
。如果您将每个循环限制为一次替换,您应该可以达到您想要的结果。这里有一个解决方案,可以在运行字符串时正确打印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
。如果将每个循环限制为一次替换,则应达到预期效果。作为一种python方法,您可以使用a根据特定长度对字符串进行分组,并将模式放入字典中:
>>> 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'
作为一种pythonic方法,您可以使用a根据特定长度对字符串进行分组,并将模式放入字典中:
>>> 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")
您应该使用
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")
因此,如果我的字符串是“AAAABCBCAAAA”,它将返回“13”,因为“BCA”在看到最后一个“AAA”之前停止了翻译?对于第一个示例,它将有助于包括您得到的输出以及它与您期望的不同之处。对于第二个示例,您可能应该包括执行时遇到的错误。@asciithenasi--No它应该忽略这个术语,我认为应该是
1234
?基于[('A','A','A','B','B'),('A','B','A'),('A','B','C'),('C','A','B'),('B','C','A')]
,脚本是否应该假设有效输入,并将字符串拆分为一个包含3个字符的代码的列表,在其中运行翻译?因此,如果我的字符串是“aaaaaaaabcbcaaaa”,它将返回“13”,因为“BCA”在看到最终的“AAA”之前停止了翻译?对于第一个示例,包含您正在获得的输出以及它与您期望的不同之处会很有帮助。对于第二个示例,您可能应该包括执行时遇到的错误。@asciithenasi--No它应该忽略这个术语,我认为应该是1234
?基于[('A','A','A','B','B'),('A','B','A'),('A','B','C'),('C','A','B'),('B','C','A')],
,脚本是否应该假定输入有效,并将字符串拆分为一个包含3个字符的代码的列表,并在其中运行翻译?谢谢@Brien。。那是我的打字错误是的输出是1234。。再次感谢@Brien.谢谢你。。那是我的打字错误是的输出是1234。。再次感谢为什么要在不需要时创建中间列表?很公平,更新答案以将其存储在列表中并返回字符串。为什么要在不需要时创建中间列表?很公平,更新答案以将其存储在列表中并返回字符串。