在python中移动n个字母

时间:2016-04-02 00:35:06

标签: python algorithm

我正在尝试解决一个udacity编程问题,如下所示:

  

编写一个过程,shift_n_letters,它将小写字母,a-z和整数n作为输入,并返回字母n步骤   之后的字母表。注意'a'跟在'z'之后,n可以是正数,负数或零。

代码:

def shift_n_letters(letter, n):
  result = chr(ord(letter) + n)
  if ord(result) > 122:
    return chr(96+ ord(result) - 122) 
return result


print shift_n_letters('s', 1)
#>>> t
print shift_n_letters('s', 2)
#>>> u
print shift_n_letters('s', 10)
#>>> c
print shift_n_letters('a', -1)
#>>> z

我得到t, u , c和`作为结果。如果我出错了,请有人帮忙。感谢。

5 个答案:

答案 0 :(得分:2)

只需将n取为字母长度的模数:

def shift_n_letters(letter, n):
    n_ = n % 26
    result = chr(ord(letter) + n_)
    if ord(result) > 122:
        result = chr(ord(result) - 26) 
    return result

它搞乱了,因为(我认为)它使用了unicode系统中的字母顺序,显然是在 a之前出现。

更新

我想出了一个更简单的算法。

def shift_n_letters(letter, n):
    return chr((ord(letter) - 97 + n % 26) % 26 + 97)

算法

  1. ord(letter) - 97 - 通过减去 a
  2. 的unicode顺序,将letter置于0-25的范围内
  3. + n % 26 - 添加班次,针对 z a
  4. 之间的期间边界进行调整
  5. % 26 - 如果班次导致订单离开范围0-25
  6. ,则取模数26
  7. + 97 - 添加 a 的unicode顺序(之前已扣除)
  8. chr(...) - 返回我们刚刚计算的unicode order index的字符

答案 1 :(得分:1)

避免错误的字母代码出现问题

def shift_n_letters(letter, n):
  result = ord(letter) + n
  while result > ord('z'):
    result -= 26
  while result < ord('a'):
    result += 26 
  return chr(result)

或(更多的succint,但有一点算术 - 模运算)

def shift_n_letters(letter, n):
  result = ( ord(letter) + n - ord('a') ) % 26
  return chr( ord('a') + result )

两者都适用于n

的任何值

答案 2 :(得分:1)

使用maketrans可以避免与chrord相关的所有麻烦。来自docs

  

string.maketrans(from,to)

     

返回一个适合传递给translate()的转换表,它将中的每个字符从映射到中相同位置的字符; 必须具有相同的长度。

您的用例示例:

import string

def shift_n_letters(text, n):
    intab = string.ascii_lowercase # "abcdefghijklmnopqrstuvwxyz"
    outtab = intab[n % 26:] + intab[:n % 26] # alphabet shifted by n
    trantab = string.maketrans(intab, outtab) # translation made b/w patterns

    return text.translate(trantab) # text is shifted to right

它在实践中的运作方式:

>>> shift_n_letters('a',-1)
'z'
>>> shift_n_letters('s',10)
'c' 
>>> shift_n_letters('hello',10)
'rovvy'

这样做的好处是可以使用比单个字符更复杂的字符串,并且可以适用于任何n

答案 3 :(得分:1)

你需要取n模26,写n%26,你当前只有n:result = chr(ord(字母)+ n%26)。这样你就可以正确地回绕而不是经过其余的unicode字符。

答案 4 :(得分:1)

我认为你可以这样做:

def shift_n_letters(letter, n):

    # Create an array of characters from 'a' to 'z'
    char_array = [chr(i) for i in range(97, 123)] 

    result = ""
    for ch in list(message):
        # Get the corresponding index in char_array and add 'n' to it. 
        # Also remember to % 26, which is length of char_array
        index = (char_array.index(ch) + n) % 26

        # And append to result string the newly computed character 
        result += char_array[index]

    return result

希望有所帮助。