![](/img/trans.png)
[英]Find index of element in sublist that is same across all the sublists in a nested list
[英]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.