基于嵌套列表的第一个元素合并嵌套列表

时间:2019-11-02 14:31:40

标签: python list nested-lists

我有很多包含一些数据的列表。

[['', 'A', 'B'],['C', '', 'D'],['E', 'F', ''],['', 'H', 'I'],['J', 'K', ''],['L', 'M', 'N']]

这些列表中表示的数据已连接。当嵌套列表的第一个元素为''时,我可以肯定地知道,此后的每个列表都应与以''元素开头的列表分开。每个列表,直到下一个列表的第一个元素为''为止。然后循环重复。任何列表中的任何元素都可以包含''。只有当第一个元素为''时,循环才会重复。

我希望从上面的列表列表中找到一种创建新列表列表的快速方法,从而在下面产生预期的结果。

[['', 'A', 'B', 'C', '', 'D', 'E', 'F', ''],['', 'H', 'I', 'J', 'K', '', 'L', 'M', 'N']]

4 个答案:

答案 0 :(得分:1)

这有效:

a = [['', 'A', 'B'],['C', '', 'D'],['E', 'F', ''],['', 'H', 'I'],['J', 'K', ''],['L', 'M', 'N']]

final = []

for i in a:
    if i[0] == "":
        final.append([])    
    final[-1].extend(i) 

print(final)

输出

[['', 'A', 'B', 'C', '', 'D', 'E', 'F', ''], ['', 'H', 'I', 'J', 'K', '', 'L', 'M', 'N']]
[Finished in 0.7s]

答案 1 :(得分:1)

这里是一个答案:

lst = [['', 'A', 'B'],['C', '', 'D'],['E', 'F', ''],['', 'H', 'I'],['J', 'K', ''],['L', 'M', 'N']]
result = []
temp = []
for l in lst:
    if len(l[0]) == 0 and len(temp) == 0:
        temp.extend(l)
    elif len(temp) != 0:
        temp.extend(l)
        if len(l[-1]) == 0:
            result.append(temp)
            temp = []
result        

输出:

[['', 'A', 'B', 'C', '', 'D', 'E', 'F', ''], ['', 'H', 'I', 'J', 'K', '']]

答案 2 :(得分:1)

您可以尝试类似

data=[['', 'A', 'B'],['C', '', 'D'],['E', 'F', ''],['', 'H', 'I'],['J', 'K', ''],['L', 'M', 'N']]

new_list = []
for l in data:
    if l and l[0]=='':
        new_list.append([])
        new_list[-1].extend(l)
    else:
        new_list[-1].extend(l)
print(new_list)

每当在new_list中找到具有第一个元素''的子列表时,便会将一个空列表附加到要输出的列表中(本例中为data)。

将新元素添加到new_list当前值的最后一个子列表中。

输出为:

[['', 'A', 'B', 'C', '', 'D', 'E', 'F', ''], ['', 'H', 'I', 'J', 'K', '', 'L', 'M', 'N']]

答案 3 :(得分:1)

您可以分两个阶段进行操作,首先找到以''开头的索引,然后遍历这些索引并创建子列表:

from itertools import chain, zip_longest

lst = [['', 'A', 'B'], ['C', '', 'D'], ['E', 'F', ''], ['', 'H', 'I'], ['J', 'K', ''], ['L', 'M', 'N']]

# find the indices
starts = [i for i, e in enumerate(lst) if e[0] == '']

# iterate over the indices in pairs (current, next)
result = [list(chain.from_iterable(lst[start:end])) for start, end in zip_longest(starts, starts[1:], fillvalue=len(lst))]

print(result)

输出

[['', 'A', 'B', 'C', '', 'D', 'E', 'F', ''], ['', 'H', 'I', 'J', 'K', '', 'L', 'M', 'N']]