更改每个组Python list的第一个元素



假设我们有以下列表:

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

我想更改此列表,以便任何时候有子组(如INS)的多个成员以I-开始,后面没有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].startswith('I'):
if iobTags[i-1].startswith('I'):
temp = iobTags[i-1].split('-')
temp[0] = 'B'
mem = temp[0] + '-' + temp[1]
iobTags[i-1] = mem
else:
continue

问题是这段代码不断地将它看到的每个I-成员更改为第一个元素之后的B-,如:

I-INS,I-INS,I-INS => B-INS,B-INS,I-INS

而我只想改变第一个元素,然后继续检查其他子组的第一个元素。我如何更改这个代码?

您可以使用itertools.groupby作为任务:

from itertools import groupby
l = ["O", "I-INS", "I-INS", "I-INS", "B-PER", "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-", "B-")
out.extend(g)
print(out)

打印:

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

list = ['O', 'O', 'O', 'O', 'I-INS', 'I-INS', 'I-INS', 'B-PER', 'I-PER']
number_of_items_in_subgroup = 0
output_list = []
for index in range(len(list)):
#First case
if index == 0:
if list[index][0] == "I":
output_list.append("B" + list[index][1:])
else:
output_list.append(list[index])

else:
if (list[index][0] == "I") & ((list[index-1][0] != "B") & (list[index-1] != list[index])) & (output_list[-1][0] != "B"):
output_list.append("B" + list[index][1:])
else:
output_list.append(list[index])




print(output_list)

检查这个。对于您提供的示例,它可以工作。

也适用于我创建的另一个随机列表。

最新更新