假設我們有以下串列:
['O'/span>, 'O'/span>, 'O'/span>, 'O', 'I-INS', 'I-INS', 'I-INS', B-PER, I-PER]
我想改變這個串列,這樣一來,只要有多個以I-開頭的子組(如INS)成員,后面沒有B-成員,第一個元素就會變為B-,例如:
O,I-INS,I-INS,I-INS,B-PER, I-PER => O,B-INS,I-INS,I-INS,B-PER, I-PER
如果一個子組已經以B-或I以外的其他東西開始,那么它應該保持不變。到目前為止,我已經寫了這樣的代碼:
temp = [] 。
for i in range(len(iobTags))。
if iobTags[i].startinwith('I'):
if iobTags[i-1].startedwith('I')。
temp = iobTags[i-1].split('-')
temp[0] = 'B'.
mem = temp[0] '-'/span> temp[1]
iobTags[i-1] = mem
else:
繼續。
問題是,這段代碼在第一個元素之后不斷地將它看到的每一個I-成員改為B-,比如:
I-INS,I-INS,I-INS => B-INS,B-INS,I-INS
而我只想讓第一個元素改變,然后繼續檢查其他子組的第一個元素。我怎樣才能改變這段代碼?
uj5u.com熱心網友回復:
你可以使用itertools.groupby來完成任務:
from itertools import groupby
l = ["O"/span>, "I-INS"/span>, "I-INS"/span>, "I-INS"/span>, "B-PER"/span>, "I-PER"]
out = []
for v, g in groupby(l, lambda k: k.split("-")[-1] )。)
g = list(g)
if g[0].startswith("I-") 。
if not any(v. startswith("B-") for v in g)。)
g[0] = g[0].replace("I-"/span>, "B-"/span>)
out.extend(g)
print(out)
列印:
['O'/span>, 'B-INS', 'I-INS'/span>, 'I-INS'/span>, 'B-PER'/span>, 'I-PER'/span>]
uj5u.com熱心網友回復:
list = ['O'/span>, 'O'/span>, 'O'/span>, 'O', 'I-INS', 'I-INS', 'I-INS'/span>, 'B-PER', 'I-PER']
number_of_items_in_subgroup = 0 ]
output_list = []
for index in range(len(list)) 。
#First case #First case
if index == 0:
if list[index][0] == "I"/span>:
output_list.append("B" list[index][1: ] )
else:
output_list.append(list[index])
else:
if (list[index][0] == "I"/span>) & ((list[index-1][0] ! = "B") & (list[index-1] ! = list[index])) & (output_list[-1][0] != "B"/span>) 。
output_list.append("B" list[index][1: ] )
else:
output_list.append(list[index])
print(output_list)
檢查這個。對于你提供的例子,它是有效的。
對于另一個例子也是有效的。
對于我創建的另一個隨機串列也是如此。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/307854.html
標籤:
上一篇:使用通配符的Bash字串格式比較
