我希望用户输入一个字符串和一个值来向前或向后移动字符。我想通过用户输入的值+每个字符在字符串中的位置来向前移动每个字符。我希望它仅对字母和数字有效,因此空格和符号不受影响。例如,如果用户输入“ 5”作为值,并输入“ a b c”作为字符串,我想将“ a”更改为“ f”; “ b”到“ i”;“ c”到“ l”。因此,输出将是“ f i l”。
假设用户仅输入小写字母。
message = input("Enter your message: ")
for characters in message:
如评论中所述,您所需要做的就是正确使用ord()
和chr()
内置方法。另外,对于字母在字符串中的位置,您可以简单地使用enumerate()
。
我会用类似这样的东西来实现:
def enc(n, s):
return "".join(
chr(ord(letter) + n + i) \
if ord('a') <= ord(letter) <= ord('z') or ord('0') <= ord(letter) <= ord('9') \
else letter for i, letter in enumerate(s))
这样,您可以通过传递enc()
参数来调用n
函数来设置要向前移动每个字符的数字,而s
参数是字符串本身。
例如:
>>> enc(5, 'a b c')
'f i l'
将ord和chr用于'a-z'或'0-9'范围内的字符
代码
def rot_n(s, n):
def limit(i, lower, upper):
" Limits characters to their range after rotation "
interval = upper - lower + 1
while i > upper:
i -= interval
while i < lower:
i += interval
return i
def lookup(v):
" Rotates a character "
o, c = ord(v), v.lower()
if 'a' <= c <= 'z':
ans = limit(o + n, ord('a'), ord('z'))
return chr(ans)
elif '0' <= c <= '9':
ans = limit(o + n, ord('0'), ord('9'))
return chr(and)
# Does not rotate non-letters
return v
# Map rotation over the string
return ''.join(map(lookup, s))
Test
print(rot_n('abcde 1234', 1)) # bcdef 2345
print(rot_n('abcde 1234', -1)) # zabcd 0123 (handles positive and negative rotation)
print(rot_n('abcde 1234', 26)) # abcde 7890 (only numbers are changed for factors of 26)
print(rot_n('abcde 1234', -26)) # abcde 5678 (only numbers are changed for factors of 26)