将向用户询问applyRules中的规则,但它不起作用[“character1:substitution”, “character2:substitution”]
当用户放置['b:c','c:d']
时,会打印c,c
。但是,当char为d
b
该函数将单个字符和一组规则作为列表。
这就是我到目前为止所写的内容
def applyRules(char, rules):
for rule_list in (rule.split(':') for rule in rules):
char = char.replace(rule_list[0], rule_list[1])
return char
我应该添加什么才能使其正常工作?
答案 0 :(得分:1)
如果您有多个规则,这会变得很麻烦。只要您对单个字符进行替换,就可以使用str.translate
轻松完成此操作。但是,这并没有解决链式替换的问题,所以你必须使用一个while
循环,直到没有更多的变化。
def applyRules(string, rules):
mapping = str.maketrans(dict(x.split(':') for x in rules))
while True:
new = string.translate(mapping)
if string == new:
break
string = new
return new
In [1308]: applyRules('bbbbb', ['b:c', 'c:d'])
Out[1308]: 'ddddd'
单个字符替换
对于涉及单个字符的替换,解决方案简化了。您可以使用get
的字典:
def applyRules(char, rules):
mapping = dict(x.split(':') for x in rules)
while True:
new = mapping.get(char, char)
if char == new:
break
char = new
return new
这应该更简单。
答案 1 :(得分:0)
您需要应用每个规则并同时保留新字符串,因为字符串在python中是不可变的。您可以使用str
类的translate。以下代码工作
def applyRules(char, rules):
modified = char
for rule in rules:
r = rule.split(':')
table = str.maketrans({r[0]:r[1]})
modified = modified.translate(table)
return modified
print(applyRules('bbbbb',['b:c','c:d'])) #prints 'ddddd'
print(applyRules('abdecbc',['b:c','c:d'])) #prints 'addeddd'