繁体   English   中英

如果第一个索引元素匹配,则合并嵌套列表的子列表

[英]Merge sublists of nested list if first index element match

list = [['100', '88', '', ''], ['100', '', '68', ''], ['100', '', '', '58'],['102', '28', '', ''], ['102', '', '2', ''], ['104', '11', '', ''], ['104', '', '2', ''], ['110', '2', '', ''], ['202', '', '14', ''], ['202', '37429', '', '']]

需要在第一个索引值上合并子列表。

output = [['100', 88, '68', '58'], ['102', 28, '2', ''],['104', 11, '2', ''],['110', 2, '', ''],['202', '37429', 14, '']]

而不是列表使用任何其他名称。

使用itertools's groupby和 groupby 1st 元素,然后将它们合并在一起,但这会给您列表列表,因此您需要使用itertools chain将它们展平。

注意:我还删除了空字符串。 您可以尝试根据您对该空字符串的需要修改代码,或者您可以稍后将它们 append 使每个列表大小为 4。

from itertools import groupby
import itertools
li = [['100', '88', '', ''], ['100', '', '68', ''], ['100', '', '', '58'],['102', '28', '', ''], ['102', '', '2', ''], ['104', '11', '', ''], ['104', '', '2', ''], ['110', '2', '', ''], ['202', '', '14', ''], ['202', '37429', '', '']]
tuple_list = list(map(tuple,li))
output_list = [[idx]+list(itertools.chain.from_iterable(list(filter(None, i[1:])) for i in e)) for idx, e in groupby(tuple_list, lambda x: x[0])]

输出列表:

[['100', '88', '68', '58'],
 ['102', '28', '2'],
 ['104', '11', '2'],
 ['110', '2'],
 ['202', '14', '37429']]

如果您还想要空字符串:

output_list = [([idx]+list(itertools.chain.from_iterable(list(filter(None, i[1:])) for i in e))+['']*4)[:4] for idx, e in groupby(tuple_list, lambda x: x[0])]

[['100', '88', '68', '58'],
 ['102', '28', '2', ''],
 ['104', '11', '2', ''],
 ['110', '2', '', ''],
 ['202', '14', '37429', '']]

更基本的方法是创建两个嵌套循环,如果第一个索引匹配,则编写一个条件,将它们移动到一个新列表。 您可以尝试将它们转换为 numpy 数组,这将使它们成为二维数组,然后您可以更轻松地进行比较

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM