我对编程非常陌生(6周,在网上自学,#34; codecademy"" python艰难的方式")。我决定是时候开始尝试编写没有方向的代码了,我在第二个项目中碰壁了。
我正在努力建立一个秘密编码器"接受raw_input字符串并将其中的每个字母替换为字母表中的下一个字母。凭借我非常有限的知识,我认为字典应该是最佳选择。随着"小" google搜索帮助,我写道:
alpha = {"a" : "b", "b" : "c", "c" : "d", "d" : "e", "e" : "f", "f" : "g","g" : "h"
, "h" : "i", "i" : "j", "j" : "k", "k" : "l", "l" : "m","m" : "n", "n" : "o"
, "o" : "p", "p" : "q", "q" : "r", "r" : "s","s" : "t", "t" : "u", "u" : "v"
, "v" : "w", "w" : "x", "x" : "y", "y" : "z", "z" : "a"}
entry = raw_input("Please write a sentence you want to encode: ")
def encode(entry, letters):
for k, v in letters.iteritems():
if k in alpha:
entry = entry.replace(k, v)
return entry
print encode(entry, alpha)
我遇到的问题是我的字符串中只有一半的字母被字典中的正确值替换。 ""和" b"将两者打印为" c"什么时候" a"应打印为" b"和" b"应打印为" c"等等。
我完全迷失的地方是,当我用数字替换字典中的每个值时,它完美地运作。
这是它的要点,我真的不知道我的代码有什么问题。
提前感谢您的帮助。
PS:这是我关于stackoverflow的第一篇文章,希望我能按照我应该的方式做所有事情。
编辑:由于我还不能给出声誉,我将在此感谢大家的有益答案。我现在可以看到我的错误有点清楚了,我将把这里提供的信息修复我的代码并正确理解它。我也可以看到解决这类问题还有更多合乎逻辑且直截了当的方法。功能对我来说仍然有点模糊,但我想这很早就是正常的。
答案 0 :(得分:1)
问题在于,由于您在字典而不是字符串上进行迭代,因此您可能会多次替换原始字符。例如,对于'ab'
的给定输入,如果iteritems
按顺序'bb'
返回键,则第一个替换将导致'cc'
,第二个替换为a, b
。请注意,由于字典是无序集合,因此返回项目的顺序是随机的。
您可以使用generator expression迭代源字符串并join
来创建结果来解决问题:
def encode(entry, letters):
return ''.join(letters.get(c, c) for c in entry)
以上示例调用get
而不是使用索引运算符来处理alpha
在源字符串中不包含字母的情况。 get
和索引运算符之间的区别在于get
采用默认值的第二个参数,如果密钥不存在,将返回该参数。在上面的示例中,默认值是字符本身。
答案 1 :(得分:1)
Xetnus是正确的,你需要循环输入变量而不是字母。也许是这样的
def encode(entry, letters):
new_entry = ''
for letter in entry:
if letter in letters:
new_entry += letters[letter]
return new_entry
print encode(entry, alpha)
答案 2 :(得分:0)
def encode(entry, letters):
for k, v in letters.iteritems():
if k in alpha:
entry = entry.replace(k, v)
return entry
print encode(entry, alpha)
在打印功能中调用encode(entry, alpha)
,将encode()
函数alpha
字典传递给函数中的letters
变量。然后,使用迭代器遍历letters
变量(alpha
字典)。然后你的if语句检查k
(你刚从letters
变量得到的alpha
字典)是否在alpha
字典中,当然是。
你需要做这样的事情:
for k, v in letters.iteritems():
if k in entry:
entry = entry.replace(k, v)
答案 3 :(得分:0)
字典没有订购,所以你要替换一些字母(' a' - ' b')而其他字母则被跳过。
对于您的启发,您正在做的事情称为rot
(轮换)。最着名的是rot13
。
当你第一次开始时自己写东西是有帮助的,但是有一个非常酷的标准库函数,叫做string.maketrans
就可以做到这一点!
答案 4 :(得分:0)
其他人已经指出如何使用字典作为查找正确地执行此操作。但是,您也可以使用str.translate
方法,避免必须进行查找和重建字符串。
import string
trans = string.maketrans(
'abcdefghijklmnopqrstuvwxyz', # from...
'bcdefghijklmnopqrstuvwxyza' # to
)
print raw_input('Please enter something to encode: ').translate(trans)