Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/356.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用字典中的replace()时出现TypeError_Python_String_Dictionary_Int_Typeerror - Fatal编程技术网

Python 使用字典中的replace()时出现TypeError

Python 使用字典中的replace()时出现TypeError,python,string,dictionary,int,typeerror,Python,String,Dictionary,Int,Typeerror,首先:请记住,我是一个编程新手 我正试图用Python编写一个简单的程序,将字符串中的辅音替换为辅音+“o”+辅音。例如,“b”将替换为“bob”,而“d”将替换为“dod”(因此“python”一词将改为“popythohonon”) 为此,我创建了一个字典,其中包含b:bob、c:coc、d:dod等对。然后我使用replace()命令通读单词,并在字典中用辅音的翻译替换辅音。完整的代码如下所示: def replacer(text): consonant='bcdfghjklmnp

首先:请记住,我是一个编程新手

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

为此,我创建了一个字典,其中包含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
list={'b':'bob', 'c':'coc', 'd':'dod', 'f':'fof', 'g':'gog', 'h':'hoh'......}
for x in consonant:
    lexicon[x] = x+"o"+x
现在,当我尝试调用此函数时,出现以下错误:

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
但当我打印“非手工制作”词典时,一切似乎都井然有序:

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

我做错了什么

词典
是一个以整数为键、元组为值的词典。当您迭代它的项时,您将得到
(integer,tuple)
形式的元组。然后将该整数和元组传递给
文本。将
替换为
i
j
,这就是它抱怨的原因。也许你的意思是:

 for i,j in lexicon.values():
     ...
对于这个简单的替换,
str.replace
很好,但是对于更复杂的替换,如果您愿意,代码可能会更健壮(并且可能执行得更快!)


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

lexicon = [ (x,'{0}o{0}'.format(x)) for x in chars ]
现在,如果您确实需要,您可以根据此列表构建dict:

lexicon = dict(enumerate(lexicon))
但可能没有必要。在这种情况下,您可以直接迭代
词典

for i,j in lexicon:
    ...
如果只执行一次,甚至可以使用生成器表达式懒洋洋地执行此操作,而不会具体化列表:

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

不。。。手工版本中的键是字符串。。。另一个版本中的KET是ints。。。int没有替换方法

这次不需要字典,只需迭代文本中的字符,将vovels或consonant+o+consonant添加到结果数组中,并将其连接到末尾的字符串:

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) 

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

lexicon = { c: c+'o'+c for c in consonant }
这相当于:

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

在这种情况下,您最好将
辅音
a
set
@mgilson设置为true。我只是不认为像
set(在“bcdfghjklmnpnpqrstvwxz”中c代表c)这样的生成器表达式是“非常初级”的
set(在“bcdfghjklmnpqrstvwxz”中c代表c)
?为什么不
set('bcd..)
,这似乎很容易理解?@DSM哦,对了,我忘了也可以从字符串创建集合,谢谢。是的,我把键和值弄混了。