我通过简单的班次解密遇到了一个小问题。
N,K = [int(s) for s in input().split()]
myres = []
alph = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
myalph = [a for a in alph]
for i in range(N):
s = input()
mylist = [d for d in str(s)]
for b in range(len(mylist)):
for c in range(len(myalph)):
if mylist[b] == myalph[c]:
mylist[b] = myalph[c-K]
print(myalph[c-K], c-K, b, c)
myres = myres + mylist
Res = [str(i) for i in myres]
print("".join(Res))
我的想法是将输入字符串的每个字符替换为与给定键(K)移位的字母表中的不同字符。
c-K
< 3
时出现问题0和替换键取自列表的后面。然后循环迭代两次。
如果密钥为A
并且我输入了X
而不是U
,那么我会在第一次迭代时获得X
X
但随后U
也会被迭代并变为{{1}}。
答案 0 :(得分:0)
你的错误是循环遍历alph
中的所有字母:
for
循环按顺序测试字母表中的所有字母,'A'
匹配。您将mylist[b]
设置为'X'
(0 - 3
为-3
,myalph[-3]
为'X'
。mylist[b]
测试字母表中的所有其他字母,因此最终到达'X'
,看到该字母匹配并将mylist[b]
设置为{{1 }}。'U'
测试字母表的剩余字母,并在没有进一步匹配的情况下到达结尾。至少你需要在转移字母时突破。
但是,您可以使用str.find()
method(直接在mylist[b]
字符串上)来查找字母的匹配索引,而不是循环。如果根本找不到该字母,它将被设置为alph
:
-1
除此之外,您还可以进行一些其他改进:
for b in range(len(mylist)):
c = alph.find(s[b])
if c > -1: # the letter exists
s[b] = alph[c - K]
转换为列表。当您确实需要将字符串转换为单个字符列表时,应使用alph
。所以list(stringobject)
就足够了。mylist = list(s)
已经是一个字符串列表,不需要再将每个字符串转换为字符串。myres
中的所有字母放入列表,然后将整个s
列表添加到mylist
到res
,您可以直接将每封信附加到处理到myres
;这也消除了改变myres
。总而言之,这导致:
myres