1

首先:请记住,我是编程的初学者。

我正在尝试用 Python 编写一个简单的程序,它将用辅音+“o”+辅音替换字符串中的辅音。例如,“b”将替换为“bob”,“d”将替换为“dod”(因此“python”一词将更改为“popytothohonon”)。

为此,我创建了一个字典,其中包含对 b:bob、c:coc、d:dod 等。然后我使用 replace() 命令通读单词并将辅音替换为字典中的翻译。完整的代码如下所示:

def replacer(text):
    consonant='bcdfghjklmnpqrstvwxz'
    lexicon={}
    for x in range(0,len(consonant)):
        lexicon[x]=(consonant[x]),(consonant[x]+'o'+consonant[x])
    for i,j in lexicon.items():
        text=(text.replace(i,j))
    return text

现在,当我尝试调用此函数时,出现以下错误:

Traceback (most recent call last):
  File "D:\x\x.py", line 37, in <module> 
      print(replacer("python"))
  File "D:\x\x.py", line 17, in replacer 
      text=(text.replace(i,j))
TypeError: Can't convert 'int' object to str implicitly

但我没有使用任何整数!字典肯定有问题,因为当我像这样“手工”制作时一切正常:

list={'b':'bob', 'c':'coc', 'd':'dod', 'f':'fof', 'g':'gog', 'h':'hoh'......}

但是当我打印“非手工”字典时,一切似乎都井井有条:

{0: ('b', 'bob'), 1: ('c', 'coc'), 2: ('d', 'dod'), 3: ('f', 'fof')........

我究竟做错了什么?

4

4 回答 4

3

lexicon是一个以整数为键、元组为值的字典。当你迭代它的项目时,你会得到表单的元组(integer,tuple)。然后,您将该整数和元组传递给text.replaceas ij这就是它抱怨的原因。也许你的意思是:

 for i,j in lexicon.values():
     ...

对于这个简单的替换,str.replace很好,但对于更复杂的替换,如果使用re.sub.


此外,正如评论中所指出的,对于这种情况,更好的数据结构是使用 a list

lexicon = [ (x,'{0}o{0}'.format(x)) for x in chars ]

现在,如果您真的想要,您可以从此列表中构建您的 dict:

lexicon = dict(enumerate(lexicon))

但可能没有必要。在这种情况下,您将lexicon直接迭代:

for i,j in lexicon:
    ...

如果您只打算这样做一次,您甚至可以懒惰地这样做,而无需使用生成器表达式实现列表:

lexicon = ( (x,'{0}o{0}'.format(x)) for x in chars )
于 2013-04-12T16:42:13.293 回答
0

这次不需要字典,只需遍历文本字符,将元音或辅音+o+辅音添加到结果数组中,然后将其连接到最后的字符串中:

def replacer(text):
    consonants = set('bcdfghjklmnpqrstvwxz')
    result = []
    for c in text:
        if c in consonants:
            result.append(c+"o"+c)
        else:
            result.append(c)
    return "".join(result)

print(replacer("python"))


对于高级用户:

def replacer(text):
    return re.sub(r"[bcdfghjklmnpqrstvwxz]", r"\g<0>o\g<0>", text) 


并回答“我做错了什么?” - 字典对任意键很有用,通常list.append()比在字典中使用键 0-n 更可取。而且由于您对辅音的位置不感兴趣,您可以像这样直接迭代字符串:

for x in consonant:
    lexicon[x] = x+"o"+x
于 2013-04-12T16:47:52.680 回答
0

我想您想要实现的是与替换相辅相成的词典映射。可以这样做:

lexicon = { c: c+'o'+c for c in consonant }

这相当于:

for c in consonant:
  lexicon[c] = c+'o'+c
于 2013-04-12T17:29:51.117 回答
-1

不...您在手工版本中的键是字符串...您在另一个版本中的 ket 是整数...整数没有替换方法

于 2013-04-12T16:42:54.530 回答