我正在尝试创建一个秘密编码程序,但是我遇到了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]
答案 0 :(得分:7)
[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
循环问题,那将无助于你学习。 : - )
答案 1 :(得分: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)
答案 2 :(得分:2)
for i in [text]:
应该是
for i in text:
在您的情况下,和i
是字符串user input-ed ..
它应该是一个整数作为索引
你想要的代码应该是......
注意:我使用了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
,文字包含'hello'这个词,
这里的for循环将迭代文本中的每个字符,即第一次迭代将超过'h',然后是'e',依此类推。
列表名称永远不应为list
,因为此名称是python中的关键字
答案 3 :(得分: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
- 循环应如下所示:
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 作为标识符并不是一个好主意,Python已经将它用作数据结构的名称。我还为您输入的letter
使用了更具描述性的标识符。
-
由于您提到了for
- 循环问题,以下是两个教程:
来自Python Wiki和此形式tutorialspoint。
答案 4 :(得分:1)
两个问题:
i
作为迭代变量并保存编码值。这个是无害的,但是做法很糟糕。您正在迭代单个元素数组,其中包含文本作为其一个元素。移除[]
周围的text
:
for i in text:
print codedList[i]
答案 5 :(得分: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]