1

我正在尝试创建一个秘密编码程序,但在使用 for 循环时遇到了问题(我从来没有真正理解过它们)。这是我到目前为止所要做的,我试图让用户输入,将用户文本的每个单词转换为编码文本,所以如果有人输入“hello”,它将变成“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]
4

6 回答 6

7

中只有一项[text]:用户输入的整个字符串。您可能希望for i in text:将 which 设置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循环问题,那将无助于您学习。:-)

于 2012-08-23T04:23:58.593 回答
4

在 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)

文档: 翻译| 制作翻译

于 2012-08-23T07:31:35.427 回答
2
for i in [text]:

应该

for i in text:

在你的i情况下是用户输入的字符串的一个字符。

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

你打算的代码应该像..

注意:我使用 raw_input 而不是 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, text 包含单词 'hello',这里的 for 循环将迭代文本中的每个字符,即第一次迭代将超过 'h',然后是 'e' 等等。

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

于 2012-08-23T04:21:25.727 回答
2

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

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

并导致vpyyl.

注意,将list作为标识符并不是一个好主意letter我还为您的输入使用了更具描述性的标识符

--

既然您提到了for-loops 的问题,这里有两个教程供您参考:来自 Python Wiki和这种形式的tutorialspoint

于 2012-08-23T04:24:05.320 回答
1

两个问题:

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

    for i in text:
        print codedList[i]
    
于 2012-08-23T04:23:15.813 回答
1

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

在您的代码中,

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

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

for i in text:
    index = list.index(i)
    i = codedList[index]
    print [i]
于 2012-08-23T04:30:46.387 回答