我正在尝试解决一个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
和`作为结果。如果我出错了,请有人帮忙。感谢。
答案 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)
ord(letter) - 97
- 通过减去 a letter
置于0-25的范围内
+ n % 26
- 添加班次,针对 z 和 a % 26
- 如果班次导致订单离开范围0-25 + 97
- 添加 a 的unicode顺序(之前已扣除)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
可以避免与chr
或ord
相关的所有麻烦。来自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
希望有所帮助。