【问题标题】:String Manipulation Python字符串操作 Python
【发布时间】:2013-07-21 21:25:34
【问题描述】:

我正在尝试通过将每个字母替换为前面两个位置的字母来修改字符串。例如'a' 替换为 'c','b' 替换为 'd'。唯一的例外是“y”应该被“a”替换,“z”应该被“b”替换(循环回到开始)。

我已经为它编写了以下代码,这似乎可以达到目的,但是输出格式有点破坏它。

string = "g fmnc wms bgblr rpylqjyrc gr zw fylb."
print string
for i in string:
    if i.isalpha():
        if ord(i)>120:
            print chr(ord(i)-24),
        else:
            print chr(ord(i)+2),
    else: 
        print i

输出:

g fmnc wms bgblr rpylqjyrc gr zw fylb.
i   h o p e   y o u   d i d n t   t r a n s l a t e   i t   b y   h a n d .

预期输出:

g fmnc wms bgblr rpylqjyrc gr zw fylb.
i hope you didnt translate it by hand.

有没有其他更快的方法来解决这个问题?

【问题讨论】:

  • from string import translate 并使用它。
  • 感谢以下作为替代方法intab = "abcdefghijklmnopqrstuvwxyz" outtab= "cdefghijklmnopqrstuvwxyzab" trantab = maketrans(intab, outtab) print string.translate(trantab)
  • cs50x?真的很好的课程:)
  • 顺便说一下,这称为Caesar cipher 或移位密码。 SO上有很多关于这个的问题。
  • @korylprince 谢谢你提供的信息。

标签: python string python-2.6


【解决方案1】:

这是一个使用 string.translate 的解决方案:

from string import translate, maketrans, ascii_lowercase

s='g fmnc wms bgblr rpylqjyrc gr zw fylb.'

rot2=maketrans(
    ascii_lowercase,
    ascii_lowercase[2:]+ascii_lowercase[:2]
    )

print s.translate(rot2)

【讨论】:

    【解决方案2】:

    您也可以使用列表理解的这种可怕的混蛋。

    message = "g fmnc wms bgblr rpylqjyrc gr zw fylb."
    print message
    print ' '.join([''.join([chr(((ord(letter)+2) % 122) + int(ord(letter)/121.0)*96) if ord(letter)>96 else letter for letter in word]) for word in message.split()])
    

    【讨论】:

      【解决方案3】:

      print i, 语法在要打印的内容的末尾添加一个空格。您可以通过将所有角色放在一个列表中并在最后''.join()ing 他们来解决这个问题:

      string = "g fmnc wms bgblr rpylqjyrc gr zw fylb."
      print string
      answer = []
      for i in string:
          if i.isalpha():
              if ord(i)>120:
                  answer.append(chr(ord(i)-24))
              else:
                  answer.append(chr(ord(i)+2))
          else: 
              answer.append(i)
      print ''.join(answer)
      

      当然,正如其他人所建议的那样,string.translate 可能会更直接

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-10-18
        相关资源
        最近更新 更多