Python 为字符串中的每个字母旋转列表

Python 为字符串中的每个字母旋转列表,python,python-3.x,Python,Python 3.x,我正在尝试制作一个Caesar密码来更改每个字母的密钥,目前我有一个可以对整个字符串进行一次加密的工作密码,运行1-25,但是我希望它对每个字母进行加密,因为字符串“ABC”会将a移位1,B移位2,C移位3,从而产生BDF 我已经有一个工作密码,只是不知道如何让它改变每个字母 upper = collections.deque(string.ascii_uppercase) lower = collections.deque(string.ascii_lowercase)

我正在尝试制作一个Caesar密码来更改每个字母的密钥,目前我有一个可以对整个字符串进行一次加密的工作密码,运行1-25,但是我希望它对每个字母进行加密,因为字符串“ABC”会将a移位1,B移位2,C移位3,从而产生BDF

我已经有一个工作密码,只是不知道如何让它改变每个字母

    upper = collections.deque(string.ascii_uppercase)
    lower = collections.deque(string.ascii_lowercase)

    upper.rotate(number_to_rotate_by)
    lower.rotate(number_to_rotate_by)

    upper = ''.join(list(upper))
    lower = ''.join(list(lower))

    return rotate_string.translate(str.maketrans(string.ascii_uppercase, upper)).translate(str.maketrans(string.ascii_lowercase, lower))
#print (caesar("This is simple", 2))
our_string = "ABC"


for i in range(len(string.ascii_uppercase)):
    print (i, "|", caesar(our_string, i))
结果是:

0 | ABC
1 | ZAB
2 | YZA
3 | XYZ
4 | WXY
5 | VWX
6 | UVW
7 | TUV
8 | STU
9 | RST
10 | QRS
11 | PQR
12 | OPQ
13 | NOP
14 | MNO
15 | LMN
16 | KLM
17 | JKL
18 | IJK
19 | HIJ
20 | GHI
21 | FGH
22 | EFG
23 | DEF
24 | CDE
25 | BCD

我希望第一个字母的移位为1或0,第二个字母的移位为2,依此类推。

很好!请注意,映射不仅会重新排列字母表中的字母,因此它永远不会通过旋转字母表来实现。在您的示例中,upper将成为以下映射:

ABCDEFGHIJKLMNOPQRSTUVWXYZ
BDFHJLNPRTVXZBDFHJLNPRTVXZ
还请注意,此密码不容易可逆,即不清楚是反转“B”->“A”还是反转“B”->“N”

(旁注:如果我们将字母zabcdeffghijklmnopqrstuvxy视为数字0-25,则此密码将乘以2(模26):
(x*2)%26
。如果不是2,而是乘以任何不可被2和13整除的数字,则生成的密码将始终是可逆的。您知道为什么吗?提示:,)


当您对一段代码感到困惑时,通常这是一个好迹象,是时候将其中的一部分重构为单独的函数,例如:

(游乐场:)

输出:

caesar("ABC"): BDF
caesar("abc"): bdf
caesar("XYZ"): VXZ

资源:


您以前使用过列表理解吗?我建议编写一个函数,给定一个索引和一个字符,将字符旋转该数量(查看mod运算符,ord,chr)。然后,在遍历明文枚举时使用列表理解。
caesar("ABC"): BDF
caesar("abc"): bdf
caesar("XYZ"): VXZ