我正在尝试用另一个列表中的单词替换列表中的特定单词集。
- 检查"s"
- invalid_list"都在" "应该替换为xyz
" "应该是:
['123xyz', '456xyz', '789xyz']
s = ['123xyz', '456xye','789xyf']
invalid_list = ['xye','xyf']
for i in invalid_list:
if i in s:
s = s.replace(i, 'xyz')
print(s)
当前(无效)输出:
['123xyz', '456xye', '789xyf']
遍历invalid_list并使用内置的replace()函数替换子字符串。
for i in invalid_list:
s = [string.replace(i, 'xyz') for string in s]
对invalid_list
的项进行循环是低效的。这增加了算法的复杂性。
一个有效的解决方案是使用正则表达式在每个字符串中只搜索一次主题:
s = ['123xyz', '456xye','789xyf']
invalid_list = ['xye','xyf']
import re
regex = re.compile('|'.join(map(re.escape, invalid_list)))
s2 = [regex.sub('xyz', x) for x in s]
输出:
['123xyz', '456xyz', '789xyz']
避免匹配部分单词:
s = ['123xyz', '456xye','789xyf']
invalid_list = ['xy','xye','xyf']
import re
regex = re.compile(f"({'|'.join(map(re.escape, invalid_list))})b")
s2 = [regex.sub('xyz', x) for x in s]
# ['123xyz', '456xye', '789xyf']
您需要另一个循环来单独取出每个字符串,然后您可以使用循环来检查是否存在任何无效字符串。
另外,您需要将更改后的字符串重新赋值到列表中。
s = ['123xyz', '456xye','789xyf']
invalid_list = ['xye','xyf']
for index,element in enumerate(s):
for i in invalid_list:
if i in element:
element = element.replace(i, 'xyz')
s[index] = element
print(s)
按要求输出
i in s
查找精确匹配,而不是子字符串。list.replace()
也替换了一个精确匹配,它不替换子字符串。
可以编写一个列表推导式来创建更新后的列表。将替换所有无效字符串的代码移到可以从列表推导式调用的函数中。
def replace_invalid(string, invalid, replacement):
for substring in invalid:
string = string.replace(substring, replacement)
return s
s = [replace_invalid(item, invalid_list, 'xyz') for item in s]