根据条件更改列表列表的元素
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_S
、I_S
和O
。
我想根据特定条件更改元素:
如果元素以 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)
这只会将您的原始列表溢出到子列表中,并在将它们重新组合在一起之前单独处理它们。
这肯定可以进一步改进,正如其他评论所建议的那样。
我有以下嵌套列表:
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_S
、I_S
和O
。
我想根据特定条件更改元素:
如果元素以 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)
这只会将您的原始列表溢出到子列表中,并在将它们重新组合在一起之前单独处理它们。
这肯定可以进一步改进,正如其他评论所建议的那样。