当它应该接收字符串时,replace方法正在接收列表

时间:2019-12-07 13:47:07

标签: python

我目前有一个字符串列表,让我们这样说:

strings = ['Hello my name is John.', 'What is your name?', 'My name is Peter.']

,我想替换每个字符串中的标点符号,并用其标记列表替换它们。我编写的代码是:

# Original list:
# strings = ['Hello my name is John.', 'What is your name?', 'My name is Peter.']

PUNC = ['.', ',', '?', '!', ':', ';', '(', ')']

for i in range(len(strings)):
    for token in PUNC:
        if token in strings[i]:
            strings[i] = strings[i].replace(token, '').split()

# New desired list:
# strings = [['Hello', 'my', 'name', 'is', John'],
#            ['What', 'is', 'your', 'name'],
#            ['My', 'name', 'is', Peter']]

当我在单个字符串元素上运行代码时,该代码可以正常工作,但是当我运行上面编写的代码时,会给出以下警告:

AttributeError: 'list' object has no attribute 'replace'

我已经使用Python Debugger设置了断点并尝试遍历代码,并且我注意到在运行上述代码之前数据是可以的,但是在运行之后,只有前两个元素被转换为它们的标记化版本然后代码会引发错误。由于原始列表仅包含字符串元素,因此甚至不应发生此错误。

有人知道为什么会这样吗?谢谢。

3 个答案:

答案 0 :(得分:1)

您应该删除.split()。它将字符串转换为列表:

PUNC = ['.', ',', '?', '!', ':', ';', '(', ')']

for i in range(len(strings)):
    for token in PUNC:
        if token in strings[i]:
            strings[i] = strings[i].replace(token, '')

您也不需要if语句:

PUNC = ['.', ',', '?', '!', ':', ';', '(', ')']

for i in range(len(strings)):
    for token in PUNC:
        strings[i] = strings[i].replace(token, '')

如果要拆分所有字符串,请在末尾进行:

PUNC = ['.', ',', '?', '!', ':', ';', '(', ')']

for i in range(len(strings)):
    for token in PUNC:
        strings[i] = strings[i].replace(token, '')
    strings[i] = strings[i].split()

答案 1 :(得分:1)

问题是您在每个split之后调用replace,将strings[i]变成一个列表。在所有替换后只需执行一次。

此外,您无需检查字符串中是否包含字符来替换它。此外,使用enumerate可以避免一直使用索引。

这是您代码的改进版本:

strings = ['Hello my name is John.', 'What is your name?', 'My name is Peter.']

# Original list:
# strings = ['Hello my name is John.', 'What is your name?', 'My name is Peter.']

PUNC = ['.', ',', '?', '!', ':', ';', '(', ')']

for i, s in enumerate(strings):
    for token in PUNC:
        s = s.replace(token, '')
    strings[i] = s.split()

print(strings)
# [['Hello', 'my', 'name', 'is', 'John'], ['What', 'is', 'your', 'name'], ['My', 'name', 'is', 'Peter']]

答案 2 :(得分:0)

我可以使用以下代码获取所需列表:

strings = ['Hello my name is John.', 'What is your name?', 'My name is Peter.']
PUNC = ['.', ',', '?', '!', ':', ';', '(', ')']
new_list =[]
for i in range(len(strings)):
    for token in PUNC:
        if token in strings[i]:
            strings[i] = strings[i].replace(token, '').split()
    new_list.append(strings[i])
print(new_list)

enter image description here