根据条件更改列表列表的元素

Change the elements of list of lists based on condition

我有以下嵌套列表:

original = [['B_S', 'O', 'O', 'O'],
            ['O', 'O', 'O', 'O', 'O', 'O', 'B_S', 'B_S', 'O', 'O'],
            ['O', 'B_S', 'O', 'O', 'B_S', 'B_S', 'B_S', 'O']]

原始列表中只有三种元素,即B_SI_SO。 我想根据特定条件更改元素: 如果元素以 B-prefix 开头(即 B_S),则以下元素应更改为以 I-prefix 开头,如果它有 B 前缀。 在这种情况下所需的输出是:

desired = [['B_S', 'O', 'O', 'O'],
            ['O', 'O', 'O', 'O', 'O', 'O', 'B_S', 'I_S', 'O', 'O'],
            ['O', 'B_S', 'O', 'O', 'B_S', 'I_S', 'B_S', 'O']]

它适用于此解决方案:

for ls in original:
    for i in range(0,len(ls)):
        if ls[i] == 'B_S' and ls[i+1] == 'B_S':
            ls[i+1] = 'I_S'

但是大型数据集需要很长时间...有什么方法可以提高代码性能吗?

您可能想研究多处理:

from multiprocessing import Pool
import os


original = [['B_S', 'O', 'O', 'O'],
            ['O', 'O', 'O', 'O', 'O', 'O', 'B_S', 'B_S', 'O', 'O'],
            ['O', 'B_S', 'O', 'O', 'B_S', 'B_S', 'B_S', 'O']]


def change(sub_list):
    len_ = len(sub_list)
    cnt = 0
    while cnt < len_:
        if sub_list[cnt] == 'B_S' and sub_list[cnt+1] == 'B_S':
            sub_list[cnt+1] = 'I_S'
        cnt += 1
    return sub_list


if __name__ == '__main__':
    results = []
    for result in Pool(processes=os.cpu_count()).map(change, original[:]):
        results.append(result)
    print(results)

这只会将您的原始列表溢出到子列表中,并在将它们重新组合在一起之前单独处理它们。

这肯定可以进一步改进,正如其他评论所建议的那样。