首先:请记住,我是编程的初学者。
我正在尝试用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')........
我做错了什么?
答案 0 :(得分:3)
lexicon
是一个字典,整数作为键,元组作为值。当你迭代它的项目时,你得到了(integer,tuple)
形式的元组。然后,您将该整数和元组作为text.replace
和i
传递给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是整齐的...内注没有替换方法