如何用 Python 替换列表中的单词

How to replace words in list with Python

我正在尝试用另一个列表中的词替换列表中的特定词组。

  1. 勾选“s”
  2. 如果“invalid_list”中的单词在“s”中,则应将其替换为 xyz

“s”的结果应该是:

['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']

您需要有另一个循环来单独提取每个字符串,然后您可以有循环来检查是否存在任何无效字符串。

此外,您需要将更改后的字符串重新分配回列表中。

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]

迭代 invalid_list 并使用 in-built replace() function 替换子字符串。

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']