【问题标题】:Replace multiple characters in a string using a set of rules使用一组规则替换字符串中的多个字符
【发布时间】:2018-06-04 05:29:06
【问题描述】:

applyRules 中的规则将被询问给用户,但它不起作用应该起作用的是 [“character1:substitution”, “character2:substitution”]

当用户输入['b:c','c:d'] 时,它会打印c,c。但是,当 char 为 b 时,它应该打印 d

该函数将单个字符和一组规则作为一个列表。

这就是我到目前为止写的内容

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

我应该添加什么才能使其正常工作?

【问题讨论】:

  • 是单字符替换吗?
  • 您应该为函数提供一个示例输入,并显示输出是什么与您期望的输出是什么。

标签: python string python-3.x


【解决方案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

这应该简单得多。

【讨论】:

  • @Whitepub 这应该仍然有效,但您会看到速度提升与仅针对字符串的其他答案。
  • 当我在函数中编写规则时它可以工作,但是当我问像char = input("What character do you want to put?") rules = input("Put your rule") inst = lsystems.applyRules(char, [rules]) print(inst)这样的用户时,它看起来不起作用。用户应该如何通过 Python Shell 设置规则?
  • @Whitepub 这是一个完全不同的问题。询问输入空格分隔规则,如下所示:"a:b b:c c:d",然后将rules.split() 传递给您的函数。
  • @Whitepub 另外,请参阅编辑。我添加了一个解决方案,它应该比翻译单个字符便宜得多
  • 对不起,由于我是编码新手,我很难快速理解。如何要求输入分隔规则以及如何通过rules.split()?
【解决方案2】:

您需要应用每条规则,同时保留新字符串,因为字符串在 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'

【讨论】:

  • 如果一次只替换一个字符,最终的复杂度为 O(n^2)。如果您将所有规则一起执行替换(在条件控制的 while 内),您最终会得到更快的结果。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-04-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-31
  • 1970-01-01
相关资源
最近更新 更多