Объединение вложенных списков на основе первого элемента вложенного списка - PullRequest
0 голосов
/ 02 ноября 2019

У меня большой список списков, который содержит некоторые данные.

[['', '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 ]

1 голос
/ 02 ноября 2019

Вы можете сделать это в два этапа, сначала найти индексы, начинающиеся с '', затем выполнить итерацию по этим индексам и создать подсписок:

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']]
1 голос
/ 02 ноября 2019

Вот один ответ:

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', '']]
1 голос
/ 02 ноября 2019

Вы можете попробовать что-то вроде

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) всякий раз, когда в * 1006 обнаружен подсписок с первым элементом ''. *.

Новые элементы добавляются в последний подсписок с текущим значением new_list.

Вывод:

[['', 'A', 'B', 'C', '', 'D', 'E', 'F', ''], ['', 'H', 'I', 'J', 'K', '', 'L', 'M', 'N']]
1 голос
/ 02 ноября 2019

Это работает:

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]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...