python - 移动文本时对列表的额外迭代

标签 python string list for-loop iteration

我遇到了一个简单的移位解密的小问题。

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-3myalph [-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 列表添加到 resmyres,你可以直接将你处理的每个字母附加到 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/

相关文章:

python - k 个最近邻,具有准确度得分和混淆矩阵的交叉验证

python - 如何将 m*n 列表转换为 n*m 列表?

python - MongoDB Spark 连接器 py4j.protocol.Py4JJavaError : An error occurred while calling o50. 加载

php - 将 PHP 循环作为字符串存储在变量中

c++ - 从 C++ 字符串中删除特殊字符(' 和 - 除外)

java - 如何按集合中对象的属性对列表进行排序?

Java - 如何插入最终列表

python - 迭代生成器时调用 iter 和 next

python - 如何对具有负数和字符的字符串进行自然排序?

c++ - std::vector 与 std::list 的插入频率和动态大小