如何用字母表中的连续字母替换姓氏中的每个字母?我需要这个脚本作为屏蔽工具。
姓氏逻辑:(更改为b,b更改为c,....,z更改为a)
示例:John Doe将成为John Epf
输入文件:names.txt
John yi
kary Strong
Joe Piazza
So man
答案 0 :(得分:1)
这称为Caesar's cipher。
看看它是如何完成的:https://stackoverflow.com/a/8895517/6664393
您稍微更改它以允许大写字符:
def caesar(plaintext, shift):
alphabet_lower = string.ascii_lowercase
alphabet_upper = string.ascii_uppercase
alphabet = alphabet_lower + alphabet_upper
shifted_alphabet_lower = alphabet_lower[shift:] + alphabet_lower[:shift]
shifted_alphabet_upper = alphabet_upper[shift:] + alphabet_upper[:shift]
shifted_alphabet = shifted_alphabet_lower + shifted_alphabet_upper
table = string.maketrans(alphabet, shifted_alphabet)
return plaintext.translate(table)
使用shift = 1
换一个。
答案 1 :(得分:0)
您问题中定义的问题可以解决如下:
parts = name.split()
parts[1]=''.join([chr((ord(c) - 65 + 1) % 26 + 65)
if ord(c) < 91 else
chr((ord(c) - 97 + 1) % 26 + 97)
for c in parts[1]])
' '.join(parts)
在这里,我将姓氏定义为字符串的第二个单词,这当然是一个强有力的假设,但对此的改进并不是问题中的主要问题。
在列表推导中完成移动字符,其中每个字符单独处理,并首先使用ord
转换为ASCII码。大写字母的ASCII码为65-90(A
- Z
),小写字母的ASCII码为97-122(a
- z
)。因此,条件ord(c) < 91
用于分隔案例。然后,在每种情况下,ASCII码被转换为0-25范围内的值,移位(在示例中,递增1),模运算% 26
用于转换移位z
回到a
。然后将结果值转换回字母ASCII码的正确范围。