【问题标题】:TypeError when using replace() from dictionary使用字典中的 replace() 时出现 TypeError
【发布时间】:2013-04-05 07:01:07
【问题描述】:

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

我正在尝试用 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')........

我做错了什么?

【问题讨论】:

    标签: python string dictionary int typeerror


    【解决方案1】:

    这次不需要字典,只需遍历文本字符,将元音或辅音+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
    

    【讨论】:

    • 在这种情况下,您最好将consonants 设为set
    • @mgilson 是的。我只是没有将像 set(c for c in "bcdfghjklmnpqrstvwxz") 这样的生成器表达式视为“非常初学者”的东西
    • set(c for c in "bcdfghjklmnpqrstvwxz")?为什么不set('bcd..'),这似乎很好理解?
    • @DSM 哦,对了,我忘了集合也可以从字符串创建,谢谢。
    【解决方案2】:

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

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

    相当于:

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

    【讨论】:

      【解决方案3】:

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

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

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


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

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

      如果你真的想要,现在你可以从这个列表中构建你的字典:

      lexicon = dict(enumerate(lexicon))
      

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

      for i,j in lexicon:
          ...
      

      如果您只打算执行一次,您甚至可以懒惰地执行此操作,而无需使用生成器表达式实现列表:

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

      【讨论】:

        【解决方案4】:

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

        【讨论】:

        • 是的,我混淆了键和值。
        猜你喜欢
        • 2020-12-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-07-20
        • 2023-03-10
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多