将姓氏中的每个字母替换为字母表中的连续字母

时间:2016-08-10 22:41:10

标签: python python-3.x

如何用字母表中的连续字母替换姓氏中的每个字母?我需要这个脚本作为屏蔽工具。

姓氏逻辑:(更改为b,b更改为c,....,z更改为a)

示例:John Doe将成为John Epf

输入文件:names.txt

John yi
kary Strong
Joe Piazza
So  man

2 个答案:

答案 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码的正确范围。