在移动文本时对列表进行额外迭代

时间:2018-05-17 11:33:17

标签: 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< 3时出现问题0和替换键取自列表的后面。然后循环迭代两次。

如果密钥为A并且我输入了X而不是U,那么我会在第一次迭代时获得X X但随后U也会被迭代并变为{{1}}。

1 个答案:

答案 0 :(得分:0)

你的错误是循环遍历alph中的所有字母:

  • for循环按顺序测试字母表中的所有字母,'A'匹配。您将mylist[b]设置为'X'0 - 3-3myalph[-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列表添加到mylistres,您可以直接将每封信附加到处理到myres;这也消除了改变myres
  • 的需要
  • Python变量名称不必限于单个字符。使用更具描述性的名称,以便在以后返回时更容易理解代码的作用。

总而言之,这导致:

myres