在Python中使用字典替换字符串中的字符

4

我曾经研究过使用字典进行字符替换,但是我的代码仍然无法正常工作。我的代码如下:

def encode(code,msg):  
    for k in code:  
        msg = msg.replace(k,code[k])  
    return msg

现在,当我运行这段代码时:
code = {'e':'x','x':'e'}
msg = "Jimi Hendrix"
encode(code,msg)

我得到的是“Jimi Hxndrix”,而不是“Jimi Hxndrie”。如何将字母'x'替换为'e'呢?


2
你只替换第一个出现的 xe,然后替换第一个出现的 ex。因此,Jimi Hendrix 变成了 Jimi Hendrie,然后变成了 Jimi Hxndrie.replace() 并不是你想象中的那样。 - Martijn Pieters
@Martjin Pieters 不行。如果在“Jimi Hendrix fixed the axes”上执行“msg = msg.replace(k,code[k])”,然后跟着“print k,' ',msg”,它首先打印出Jimi Hendrie fieed the aees,然后是Jimi Hxndrix fixxd thx axxs。这是因为code是一个字典,它的迭代顺序不是先是'e'然后是'x',而是先是'x'然后是'e'。并且字符串中所有字符的出现都被替换了,而不仅仅是第一个。 - eyquem
5个回答

8
你可以查看 str.translate 或者进行以下操作:
''.join(code.get(ch, ch) for ch in msg)

2
使用 maketranstranslate
from string import maketrans
msg.translate(maketrans(''.join(code.keys()), ''.join(code.values())))

我认为正确的方法应该是:msg.translate(maketrans(''.join(code.values()), ''.join(code.keys())))而不是msg.translate(maketrans(''.join(code.keys()), ''.join(code.values())))虽然在这种情况下结果是相同的。 - Nikolas
通常情况下,你会将字典写成 {from: to} 的形式。 - ecatmur

0

你正在交换x和e;这将覆盖您先前的编辑。

您应该从旧字符串复制到新字符串(或更确切地说,是字符数组,因为正如Kalle指出的那样,字符串是“不可变的”/不可编辑的),以便您不会覆盖已经替换的字符:

def encode(code, message):
    encoded = [c for c in message]
    for i, c in enumerate(message):
        try:
            encoded[i] = code[c]
        except KeyError:
            pass
    return ''.join(encoded)

其他答案是库函数,类似于这样做,但它们没有解释你哪里出错了。


无法工作,因为字符串是不可变的(参见http://docs.python.org/2/faq/design.html#why-are-python-strings-immutable),即您不能使用`encoded[i] = code[c]`之类的操作更改现有字符串。 - Carl Ekerot
谢谢,我没注意到。现在改用字符数组了。(我相信在 Ruby 中这也可以工作 - 我从来没有弄清楚两种语言中字符串处理的区别。我经常使用 Python,只是不用它进行字符串操作!) - tehwalrus

0
     python 3.2
     use your own code it is ok.

     def encode(code,msg):  
                for k in code:  
                       msg = msg.replace(k,code[k],1)  
                return msg

       ##  str.replace(old,new,[,count])
      so when you loop in your code = {'e':'x','x':'e'}
      first it gets the key "x" then the key "e" because dict is not ordered
      so,  "Hendrix" turns into "Hendrie" then "Hendrie" turns into Hxndrix and
     you are not having your result. but if you add 1 in your code
      msg.replace(k,code[k],1) then it only will replace one letter per loop and you                                    
      have your result Try.

0

问题在于你遍历的是代码,而不是消息

Jon Clements程序中使用的是遍历消息,可以更明确地写成:

print ''.join(code[ch] if ch in code else ch for ch in msg)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接