【问题标题】:Can't figure out for loops无法弄清楚 for 循环
【发布时间】:2012-08-23 04:18:17
【问题描述】:

我正在尝试创建一个秘密编码程序,但遇到了 for 循环问题(我从来没有真正理解它们)。这是我到目前为止所要做的,我试图让用户输入,将用户文本的每个单词转换为编码文本,所以如果有人输入“你好”,它将变成“vpyyl”。有人可以帮忙吗?这甚至可能吗?

这是我目前所拥有的,它给出了一个错误“列表索引必须是整数,而不是 str”。我很确定 for 循环也设置错误。

import random

list = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z']
codedList = ['s', 'q', 'n', 'z', 'p', 'o', 'k', 'v', 'm', 'c', 'i', 'y', 'w', 'a', 'l', 't', 'd', 'r', 'j', 'b', 'f', 'e', 'h', 'u', 'x', 'g']

text = input("Enter your text: ")

for i in [text]:
    i = codedList[i]
    print[i]

【问题讨论】:

    标签: python for-loop python-3.x


    【解决方案1】:

    [text] 中只有一项:用户输入的整个字符串。您可能需要for i in text:,它将i 设置为字符串的每个字符。

    此外,您已将列表命名为 list(这意味着您无法访问内置名称 list)。并且列表由整数索引,而您尝试使用字符串访问元素。您可能希望为此使用字典,将每个字母映射到其编码等效项。

    其他几个问题是您没有任何代码来处理输入字母以外的其他内容(空格、标点符号)并且字母都是小写的情况。最后,您在 print 调用中使用方括号而不是括号,并且您没有禁止换行。

    所以:

    code = dict(a='s', b='q', c='n', d='z', e='p', f='o', g='k', h='v', i='m', j='c',
                k='i', l='y', m='w', n='a', o='l', p='t', q='d', r='r', s='j', t='b',
                u='f', v='e', w='h', x='u', y='x', z='g')
    
    # another way to define the dictionary (you don't need both)
    alphabet      = "abcdefghijklmnopqrstuvwxyz"
    codedalphabet = "sqnzpokvmciywaltdrjbfehuxg"
    code          = dict(zip(alphabet, codedalphabet))
    
    # add upper-case versions of all letters to dictionary
    for letter, codedletter in code.iteritems():
        code[letter.upper()] = codedletter.upper()
    
    for char in input("Enter your text: "):
        if char in code:
            print(code[char], end="")
        else:
            print(char, end="")    # not an alphabetic character, print as-is
    print()                        # we haven't printed a line break; do so now
    

    正如其他人所指出的,Python 中内置了一些东西可以使这变得微不足道,但如果您在使用 for 循环时遇到问题,那将无助于您学习。 :-)

    【讨论】:

      【解决方案2】:

      在 Python 中,在开始编程之前,请检查是否有内置函数可以执行相同的操作。有 90% 的可能性。

      chars = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z']
      coded = ['s', 'q', 'n', 'z', 'p', 'o', 'k', 'v', 'm', 'c', 'i', 'y', 'w', 'a', 'l', 't', 'd', 'r', 'j', 'b', 'f', 'e', 'h', 'u', 'x', 'g']
      
      table = str.maketrans(chars, coded)
      coded_text = text.translate(table)
      
      print (coded_text)
      

      文档:translate | maketrans

      【讨论】:

      • +1 在实践中,在标准库和 NumPy 之间,我在 Python 中使用的 for 循环比在 C 中少得多。
      【解决方案3】:
      for i in [text]:
      

      应该是

      for i in text:
      

      在您的情况下,i 是用户输入的字符串的字符..

      它应该是一个整数来作为索引

      你想要的代码应该是这样的..

      注意:我使用的是 raw_input 而不是 input, 因为输入会尝试 eval 用户输入,你最终会得到 NameError 错误

      In [214]: import random
      
      In [215]: mylist = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z']
      
      In [216]: codedList = ['s', 'q', 'n', 'z', 'p', 'o', 'k', 'v', 'm', 'c', 'i', 'y', 'w', 'a', 'l', 't', 'd', 'r', 'j', 'b', 'f', 'e', 'h', 'u', 'x', 'g']
      
      In [217]: text = raw_input("Enter your text: ")
      Enter your text: hello
      
      In [218]: str = []
      
      In [219]: for i in text:
         .....:     j = mylist.index(i)
         .....:     str.append(codedList[j])
         .....:
      
      In [220]: ''.join(str)
      Out[220]: 'vpyyl'
      

      至于for loop,文本中包含“你好”这个词, 这里的 for 循环将迭代文本中的每个字符,即第一次迭代将超过 'h',然后是 'e' 等等。

      列表的名称不应该是list,因为这个名称是python中的关键字

      【讨论】:

        【解决方案4】:

        有许多不同的方法可以完成您正在尝试做的事情。但专注于您已经开始的内容和您当前的代码(为了可读性/清晰度而更改了一些标识符),然后给出:

        clearList = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z']
        codedList = ['s', 'q', 'n', 'z', 'p', 'o', 'k', 'v', 'm', 'c', 'i', 'y', 'w', 'a', 'l', 't', 'd', 'r', 'j', 'b', 'f', 'e', 'h', 'u', 'x', 'g']
        
        text = input("Enter your text: ")
        

        您的for-loop 应该如下所示:

        for letter in text:            # iterate over the text not [text]
           idx = clearList.index(letter)  # find the index for the given letter in clearList
           print(codedList[idx], end="")  # get the corresponding coded letter with the index
        

        结果为@​​987654326@。

        注意,将list作为标识符并不是一个好主意,Python已经使用它作为数据结构的名称.我还为您输入的letter 使用了更具描述性的标识符。

        --

        由于您提到for-loops 存在问题,这里有两个教程供您参考: 来自 Python Wiki 和这种形式 tutorialspoint

        【讨论】:

        • @NoobMcNoobNoob 我更新的答案还包含指向for-loops 上的一些教程的链接,因为您提到它们会给您带来问题。
        【解决方案5】:

        两个问题:

        1. 您使用i 作为迭代变量和保存编码值。这是一种无害的做法,但却是不好的做法。
        2. 您正在迭代一个包含文本作为其一个元素的单元素数组。去掉text周围的[]

          for i in text:
              print codedList[i]
          

        【讨论】:

          【解决方案6】:

          我认为您正在尝试用另一个字母对您的字符串进行编码。

          在您的代码中,

          for i in [text]:
              i = codedList[i]
              print[i]
          

          您应该通过 .index() 在原始列表中找到“i”的索引。 一个可行的修订代码如下。

          for i in text:
              index = list.index(i)
              i = codedList[index]
              print [i]
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2021-08-30
            • 1970-01-01
            • 2013-10-07
            • 2023-03-25
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多