【问题标题】:Replacing characters in a string using dictionary in Python在 Python 中使用字典替换字符串中的字符
【发布时间】:2012-11-17 13:58:41
【问题描述】:

我已经使用字典研究了字符替换,但我仍然无法让我的代码正常工作。我的代码是这样的:

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”?

【问题讨论】:

  • 您只替换了e第一次 出现的x,然后xe第一次 出现.因此,Jimi Hendrix 变为 Jimi Hendrie,然后变为 Jimi Hxndrie.replace() 没有做你认为的事情。
  • @Martjin Pieters No. 如果在 "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”后的顺序迭代。并且字符串中所有出现的字符都会被替换,而不仅仅是第一个。

标签: python dictionary replace character


【解决方案1】:

使用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()))) 虽然在这种情况下结果是一样的。
  • @Nikpa 通常你会把字典写成{from: to}
【解决方案2】:

你可以看str.translate或者做:

''.join(code.get(ch, ch) for ch in msg)

【讨论】:

    【解决方案3】:

    问题是你迭代 code 而不是 msg

    msg 上的迭代是 Jon Clements 的程序中所做的,可以更明确地写为

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

    【讨论】:

      【解决方案4】:

      你正在交换 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)
      

      其他答案是执行类似操作的库函数,但它们没有解释您哪里出错了。

      【讨论】:

      • 不起作用,因为字符串是immutable,也就是说,您不能使用encoded[i] = code[c]等操作更改现有字符串
      • 谢谢,错过了。现在使用一个字符数组代替。 (我确信这可以在 Ruby 中工作——我从来没有弄清楚这两种语言在字符串处理方面的区别。我经常使用 python,只是不用于字符串操作!)
      【解决方案5】:
           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.
      

      【讨论】:

        猜你喜欢
        • 2022-11-10
        • 2021-05-15
        • 2018-03-02
        • 1970-01-01
        • 2013-11-18
        • 2016-02-03
        • 1970-01-01
        • 1970-01-01
        • 2022-11-17
        相关资源
        最近更新 更多