替换非空字符串列表中的字符串

时间:2017-05-10 15:51:10

标签: python list

尝试编写代码来替换/审查句子/字符串中的单词。当我跑它时抛出

  

回溯(最近一次呼叫最后):文件" 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.replaceindexenumerate 等,但我想知道为什么这段代码会抛出错误,因为它看来它的组成部分运行正常。

我在这里错过了什么?

3 个答案:

答案 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