我目前有一个字符串列表,让我们这样说:
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设置了断点并尝试遍历代码,并且我注意到在运行上述代码之前数据是可以的,但是在运行之后,只有前两个元素被转换为它们的标记化版本然后代码会引发错误。由于原始列表仅包含字符串元素,因此甚至不应发生此错误。
有人知道为什么会这样吗?谢谢。
答案 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)