Python 在列表中查找并保留模式并替换其他模式

Python find and keep patterns in a list and replace others

我正在尝试编写代码以从列表列表中的每个列表中提取模式。我搜索具有指定长度的模式,例如 'B-' 后跟 'I-'。例如,我想保留长度为 2 的模式,并用以下列表中的指定字符串替换其他模式:

list = ['O', 'B-', 'I-', 'I-', 'O', 'B-', 'I-', 'B-']

预期输出应如下所示:

expected_list_2 = ['O', 'O', 'O', 'O', 'O', 'B-', 'I-', 'O']

可以看到只保留两个模式的长度'B-','I-',其他的用'O'标签改变。

如果我想保留长度为三的模式,输出应该如下:

expected_list_3 = ['O', 'B-', 'I-', 'I-', 'O', 'O', 'O', 'O']

考虑到我的列表列表中的每个元素都包含此类列表,我尝试为每个列表实现此任务,我问,是否有任何有效或棘手的方法来执行此操作而不是定义一些 if-else条件和遍历每个元素?

此解决方案应该(请在部署到生产环境之前使用更多相关案例进行测试)找到 模式 'B-'、n-1 x 'I-' 的所有位置在 list 中。我扩展了示例 list1 以涵盖更多情况,例如列表开头和结尾的 pattern 以及连续的 patterns.

list1 = ['B-', 'I-', 'I-', 'O', 'B-', 'I-', 'I-', 'B-', 'I-', 'B-', 'I-', 'O', 'B-', 'I-', 'I-']
#n = 2:                                            ^^^^^^^^^   ^^^^^^^^^
#n = 3:  ^^^^^^^^^^^^^^^^        ^^^^^^^^^^^^^^^                                ^^^^^^^^^^^^^^^

def find_pattern(list1, n):
    pattern = ['B-'] + ['I-'] * (n-1)
    first = pattern[0]
    
    # find starting indices of matching patterns
    idx = [e for e, i in enumerate(list1[:-n+1 or None])
             if i == first                   # optimization for long pattern
            and list1[e:e+n] == pattern
            and list1[e+n:e+n+1] != ['I-']]

    # insert pattern at those indices
    res = ['O'] * len(list1)
    for i in idx:
        res[i:i+n] = pattern 
    return res

print(find_pattern(list1, 2))
print(find_pattern(list1, 3))

输出

['O', 'O', 'O', 'O', 'O', 'O', 'O', 'B-', 'I-', 'B-', 'I-', 'O', 'O', 'O', 'O']
['B-', 'I-', 'I-', 'O', 'B-', 'I-', 'I-', 'O', 'O', 'O', 'O', 'O', 'B-', 'I-', 'I-']