Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/364.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用Python替换字符串中的成对字符_Python_Python 2.7_Dynamic Programming - Fatal编程技术网

如何使用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。。再次感谢为什么要在不需要时创建中间列表?很公平,更新答案以将其存储在列表中并返回字符串。为什么要在不需要时创建中间列表?很公平,更新答案以将其存储在列表中并返回字符串。