繁体   English   中英

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

[英]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- prefix )。 在这种情况下,所需的 output 是:

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)

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

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

暂无
暂无

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

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