繁体   English   中英

用字典python中的值替换字符串中的多个字符

[英]replace multiple characters in string with value from dictionary python

我正在尝试创建一个遍历字符串的函数,在字典中找到与键匹配的字符,然后用字典中该键的值替换该字符。 但是,它目前仅替换字典中出现的字母的第一个出现的字母,并在该处停止,这是我哪里出错了?

d = {
'I':'1', 'R':'2', 'E':'3', 'A':'4', 'S':'5', 'G':'6', 'T':'7', 'B':'8', 'O':'0',
'l':'1', 'z':'2', 'e':'3', 'a':'4', 's':'5', 'b':'6', 't':'7', 'g':'9', 'o':'0',
}

def cypher(string):
    for i in string:
        if i in d:
            a = string.replace(i,d[i])
            return a

您的return语句位于if语句内,因此,如果一个字符匹配,则函数将替换该单个字符,然后返回。

如果要替换所有字符,可以通过将return语句移到for循环之外来遍历字符串的所有字符。

def cypher(string):
    result = string
    for i in string:
        if i in d:
            result = result.replace(i,d[i])
    return result

一个衬纸-> print ''.join(d[c] if c in d else c for c in s)

样本输出:

>>> s = 'Hello World' 
>>> d = {
'I':'1', 'R':'2', 'E':'3', 'A':'4', 'S':'5', 'G':'6', 'T':'7', 'B':'8', 'O':'0',
'l':'1', 'z':'2', 'e':'3', 'a':'4', 's':'5', 'b':'6', 't':'7', 'g':'9', 'o':'0',
}
>>> print ''.join(d[c] if c in d else c for c in s)
H3110 W0r1d

您过早地结束了代码,并在for循环中return了调用。 您可以通过将新的字符串存储在循环之外来修复它,仅在循环完成后返回:

def cypher(string):
    a = string  # a new string to store the replaced string
    for i in string:
        if i in d:
            a = a.replace(i, d[i])
    return a

但是,逻辑也有问题。 如果您的词典中的值也是词典中的键,则该键可能会被替换两次。 例如,如果您具有d = {'I': 'i', 'i': 'a'} ,并且输入为Ii ,则输出将为aa

这是一个使用join更简洁的实现,它没有这个问题。

def cypher(string):
    return ''.join(d.get(l, l) for l in string)

正如zachyee指出的那样,您的return语句位于循环内。

您可能需要看一下str.translate ,它确实满足您的需求:

def cypher(string):
    return string.translate(str.maketrans(d))

请注意使用str.maketrans将您的字典转换为string.translate可以使用的东西。 但是,此方法仅限于单个字符的映射。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM