从字典中使用replace()时的TypeError

时间:2013-04-12 16:39:43

标签: python string dictionary int typeerror

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

我正在尝试用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 个答案:

答案 0 :(得分:3)

lexicon是一个字典,整数作为键,元组作为值。当你迭代它的项目时,你得到了(integer,tuple)形式的元组。然后,您将该整数和元组作为text.replacei传递给j,这就是为什么它会抱怨。也许你的意思是:

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

对于这个简单的替换,str.replace很好,但是对于更复杂的替换,如果你use re.sub instead,代码可能会更强大(并且可能执行得更快!)。


另外,正如评论中所指出的,对于这种情况,更好的数据结构将是使用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 )

答案 1 :(得分: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) 

<小时/> 并回答“我做错了什么?” - 字典对于任意键很有用,通常在字典中使用键0-n时,list.append()是首选。既然你对辅音的位置不感兴趣,你可以像这样直接迭代字符串:

for x in consonant:
    lexicon[x] = x+"o"+x

答案 2 :(得分:0)

我想你想要实现的是词典映射辅音替换。它可以这样做:

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

相当于:

for c in consonant:
  lexicon[c] = c+'o'+c

答案 3 :(得分:-1)

不...你手工制作的版本中的钥匙是字符串...你在另一个版本中的kets是整齐的...内注没有替换方法