我遇到了一个简单的移位解密的小问题。
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
< 0 并且替换键取自列表的后面时,就会出现问题。然后循环被迭代两次。
如果键是 3
并且我输入 A
而不是 X
,我会得到 U
因为第一次迭代给出 X
但随后 X
也被迭代并变成 U
。
最佳答案
你的错误在于遍历了 alph
中的所有字母:
for
循环按顺序测试字母表中的所有字母,'A'
匹配。您将mylist[b]
设置为'X'
(0 - 3
是-3
和myalph [-3]
是'X'
。- 然后循环继续根据
mylist[b]
测试字母表中的所有其他字母,所以最终它到达'X'
,发现字母匹配并将mylist[b]
设置为'U'
。 - 循环继续根据
mylist[b]
测试字母表中剩余的字母,并在没有进一步匹配的情况下到达结尾。
至少当您移动了一个字母时,您需要跳出循环。
但不是循环,你可以使用 str.find()
method (直接在 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
的需要。 - Python 变量名不需要限制为单个字符。使用更具描述性的名称,以便您稍后返回代码时更容易理解代码的作用。
综合起来,这会导致:
alphabet = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
parts, key = [int(s) for s in input().split()]
results = []
for part in range(parts):
characters = input()
for character in enumerate(characters):
letter_idx = alphabet.index(character)
if letter_idx > -1:
# this is a letter in the alphabet, shift it with the key
character = alphabet[letter_idx - key]
results.append(character)
print("".join(results))
关于python - 移动文本时对列表的额外迭代,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50390409/