尝试编写代码来替换/审查句子/字符串中的单词。当我跑它时抛出
回溯(最近一次呼叫最后):文件" python",第21行,in 文件" python",第10行,在审查员TypeError:列表索引中 必须是整数,而不是str
这是我的代码:
def censor(text, word):
censored = text.split()
censoredword ="*"*len(word)
for n in censored:
if n == word:
censored[n] = censoredword
print " ".join(censored)
censor("hey baby hey", "baby")
我的预期输出为hey **** hey
我已经测试并打印了用censored[1]= "string"
替换拆分字符串的部分,为不同的censoredword
输入打印word
输出,我非常确定我&我#39;已成功以类似的方式迭代列表,但不是替换列表项。我没有尝试改变列表中的不可变字符串,只需将列表索引中的字符串替换为另一个字符串。
也就是说,测试一下:
listbegin =['hey', 'baby', 'hey']
print " ".join(listbegin)
listbegin[1] = "*"*len(listbegin[1])
print " ".join(listbegin)
返回:
hey baby hey
hey **** hey
我试图做的练习(自学,而不是家庭作业)假设你不了解我所使用的东西 - 我知道我可以使用.append
,.replace
,index
,enumerate
等,但我想知道为什么这段代码会抛出错误,因为它看来它的组成部分运行正常。
我在这里错过了什么?
答案 0 :(得分:2)
for x in y
循环是每个循环的。 x
将采用y
中每个元素的值。所以在这种情况下,x
将是一个字符串而不是索引。如果您需要索引,则需要将整数0
迭代到len(censored)
:
for i in range(len(censored)):
if censored[i] == word:
censored[i] = censoredWord
答案 1 :(得分:0)
在您的代码中,n
是列表censored
的元素。所以,n
是一个字符串。您无法使用n
作为索引。只允许整数进行索引。
如果您想避免过于复杂的方法(避免枚举等等),您可以执行以下操作 -
i = 0
for n in censored:
if n == word:
censored[i] = censoredword
i += 1
通过这种方式,您可以跟踪索引
答案 2 :(得分:0)
Nonlinearfruit是正确的。您的for
... in
指的是列表项,而不是其索引/位置,因此当您要替换时,您的语句censored[n]
指的是{{ 1}}嘿censored[
审查[] or
而不是列表中这些字符串的位置,因此它会抛出错误(因为baby]
和{{1}是字符串,而不是整数,表明它们在列表中的位置)。
您还可以通过一行压缩代码:
hey