繁体   English   中英

如何用 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']

遍历 invalid_list 并使用内置的replace() 函数替换子字符串。

for i in invalid_list:
    s = [string.replace(i, 'xyz') for string in 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的项目进行循环是低效的。 这增加了算法的复杂性。

一个有效的解决方案是使用正则表达式在每个字符串中只搜索一次主题:

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)

按要求输出

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM