[英]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.