假设我有一个字符串:
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)
但是语法有问题。
所以主要问题是从头开始检查字符串并替换字符。 请帮帮我。
由于
答案 0 :(得分:3)
这是一个解决方案,可以在字符串上运行时正确打印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
。如果将每个循环限制为单个替换,则应达到所需的结果。
答案 1 :(得分:1)
作为一种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'
答案 2 :(得分:1)
您应该使用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")