【发布时间】:2021-06-16 12:14:08
【问题描述】:
我有一个列表如下:
original_list = [['B_S', 'O', 'O', 'O'],
['B_S', 'O', 'O', 'O'],
['O', 'O', 'B_S', 'O'],
['O', 'O', 'O', 'O', 'B_S', 'O', 'O', 'O', 'O', 'O'],
['O', 'O', 'O', 'O', 'O', 'B_S', 'O', 'O', 'O', 'O'],
['O', 'O', 'O', 'O', 'O', 'O', 'B_S', 'O', 'O', 'O'],
['O', 'O', 'O', 'O', 'O', 'B_S', 'O', 'O', 'B_S', 'B_S', 'O', 'O'],
['O', 'O', 'O', 'O', 'O', 'B_S', 'O', 'O', 'B_S', 'O', 'O', 'O'],
['O', 'O', 'O', 'O', 'O', 'B_S', 'O', 'O', 'B_S', 'O', 'O', 'O']]
我想根据大多数元素将每三个列表聚合为一个列表。也就是说,如果两个位置具有相同的元素,则新列表将在相同位置采用相同的元素。 期望的输出应该是这样的:
desired_output = [['B_S', 'O', 'O', 'O'],
['O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O'],
['O', 'O', 'O', 'O', 'O', 'B_S', 'O', 'O', 'B_S', 'O', 'O', 'O']]
我已经尝试过这个复杂的功能:
def collect_labels(lab_user):
def aggregate_labels(a,b,c):
aggregated_list = []
# iterate over 3 lists
for x,y,z in zip(a, b, c):
if x != 'O':
aggregated_list.append(x)
elif y != 'O':
aggregated_list.append(y)
#elif z != 'O':
#aggregated_list.append(z) # you can improve the code
else:
aggregated_list.append(z)
return aggregated_list
result = [aggregate_labels(lab_user[i], lab_user[i+1], lab_user[i+2]) for i in range(0,len(lab_user)-2, 3)]
return result
但它返回错误的结果:
wrong_result= [['B_S', 'O', 'O', 'O'],
['O', 'O', 'O', 'O', 'O', 'O', 'B_S', 'O', 'O', 'O'],
['O', 'O', 'O', 'O', 'O', 'B_S', 'O', 'O', 'B_S', 'B_S', 'O', 'O']]
如果您能帮助我更正我的代码,我将不胜感激!
【问题讨论】:
-
[[statistics.mode(i) for i in zip(*j)] for j in (original_list[i*3:i*3+3] for i in range(len(original_list)//3))]