Python 如何聚合嵌套列表中的元素
我的清单如下:Python 如何聚合嵌套列表中的元素,python,list,function,Python,List,Function,我的清单如下: 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
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']]
如果您能帮助我更正代码,我将非常感激 问题最难的部分是将列表分为三个部分:
>>> [original_list[i*3:i*3+3] for i in range(len(original_list)//3)]
[[['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']]]
但是,一旦有了这些,您就可以使用zip
对要比较的项目进行分组:
>>> chunks = [original_list[i*3:i*3+3] for i in range(len(original_list)//3)]
>>> [list(zip(*j)) for j in chunks]
[[('B_S', 'B_S', 'O'), ('O', 'O', 'O'), ('O', 'O', 'B_S'), ('O', 'O', 'O')],
[('O', 'O', 'O'), ('O', 'O', 'O'), ('O', 'O', 'O'), ('O', 'O', 'O'), ('B_S', 'O', 'O'), ('O', 'B_S', 'O'), ('O', 'O', 'B_S'), ('O', 'O', 'O'), ('O', 'O', 'O'), ('O', 'O', 'O')],
[('O', 'O', 'O'), ('O', 'O', 'O'), ('O', 'O', 'O'), ('O', 'O', 'O'), ('O', 'O', 'O'), ('B_S', 'B_S', 'B_S'), ('O', 'O', 'O'), ('O', 'O', 'O'), ('B_S', 'B_S', 'B_S'), ('B_S', 'O', 'O'), ('O', 'O', 'O'), ('O', 'O', 'O')]]
然后,您只需要在每个压缩元组中选择出现频率最高的项——也称为statistics.mode
:
>>> import statistics
>>> [[statistics.mode(i) for i in zip(*j)] for j in chunks]
[['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']]
或全部:
from statistics import mode
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']]
CHUNK_LEN = 3
desired_output = [
[mode(i) for i in zip(*j)]
for j in (
original_list[i*CHUNK_LEN:(i+1)*CHUNK_LEN]
for i in range(len(original_list)//CHUNK_LEN)
)
]
显然,如果您可以将原始列表
正确地预先分组,这会容易得多:
from statistics import mode
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 = [
[mode(i) for i in zip(*j)]
for j in original_list
]
问题最难的部分是将列表分为三个部分:
>>> [original_list[i*3:i*3+3] for i in range(len(original_list)//3)]
[[['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']]]
但是,一旦有了这些,您就可以使用zip
对要比较的项目进行分组:
>>> chunks = [original_list[i*3:i*3+3] for i in range(len(original_list)//3)]
>>> [list(zip(*j)) for j in chunks]
[[('B_S', 'B_S', 'O'), ('O', 'O', 'O'), ('O', 'O', 'B_S'), ('O', 'O', 'O')],
[('O', 'O', 'O'), ('O', 'O', 'O'), ('O', 'O', 'O'), ('O', 'O', 'O'), ('B_S', 'O', 'O'), ('O', 'B_S', 'O'), ('O', 'O', 'B_S'), ('O', 'O', 'O'), ('O', 'O', 'O'), ('O', 'O', 'O')],
[('O', 'O', 'O'), ('O', 'O', 'O'), ('O', 'O', 'O'), ('O', 'O', 'O'), ('O', 'O', 'O'), ('B_S', 'B_S', 'B_S'), ('O', 'O', 'O'), ('O', 'O', 'O'), ('B_S', 'B_S', 'B_S'), ('B_S', 'O', 'O'), ('O', 'O', 'O'), ('O', 'O', 'O')]]
然后,您只需要在每个压缩元组中选择出现频率最高的项——也称为statistics.mode
:
>>> import statistics
>>> [[statistics.mode(i) for i in zip(*j)] for j in chunks]
[['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']]
或全部:
from statistics import mode
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']]
CHUNK_LEN = 3
desired_output = [
[mode(i) for i in zip(*j)]
for j in (
original_list[i*CHUNK_LEN:(i+1)*CHUNK_LEN]
for i in range(len(original_list)//CHUNK_LEN)
)
]
显然,如果您可以将原始列表
正确地预先分组,这会容易得多:
from statistics import mode
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 = [
[mode(i) for i in zip(*j)]
for j in original_list
]
使用循环的更广泛解决方案:
def merge_result(data):
ar = []
for i in range(0, len(data)-2, 3):
temp = []
for j in range(len(data[i])):
if data[i][j] == data[i+1][j]:
temp.append(data[i][j])
elif data[i+2][j] == data[i+1][j]:
temp.append(data[i+1][j])
elif data[i][j] == data[i+2][j]:
temp.append(data[i][j])
else:
temp.append('O')
ar.append(temp)
return ar
if __name__ == "__main__":
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']]
print(merge_result(original_list))
输出:
[['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 merge_result(data):
ar = []
for i in range(0, len(data)-2, 3):
temp = []
for j in range(len(data[i])):
if data[i][j] == data[i+1][j]:
temp.append(data[i][j])
elif data[i+2][j] == data[i+1][j]:
temp.append(data[i+1][j])
elif data[i][j] == data[i+2][j]:
temp.append(data[i][j])
else:
temp.append('O')
ar.append(temp)
return ar
if __name__ == "__main__":
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']]
print(merge_result(original_list))
输出:
[['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']]
[[statistics.mode(i)for i in zip(*j)]for j in(原始列表[i*3:i*3+3]for i in range(len(原始列表)//3))
[[statistics.mode(i)for i in zip(*j)]for j in(原始列表[i*3:i*3+3]for i in range(len in(原始列表)//3))