Подтвердить что ты не робот

Python, разделяющий список на основе слова разделителя

У меня есть список, содержащий различные строковые значения. Я хочу разбить список, когда вижу WORD. Результатом будет список списков (которые будут подсписками исходного списка), содержащие ровно один экземпляр WORD, я могу сделать это, используя цикл, но есть ли еще более питонический способ сделать это?

Пример = ['A', 'WORD', 'B' , 'C' , 'WORD' , 'D']

result = [['A'], ['WORD','B','C'],['WORD','D']]

Это то, что я пробовал, но на самом деле он не достигает того, чего я хочу, так как он помещает WORD в другой список, в котором он должен находиться:

def split_excel_cells(delimiter, cell_data):

    result = []

    temp = []

    for cell in cell_data:
        if cell == delimiter:
            temp.append(cell)
            result.append(temp)
            temp = []
        else:
            temp.append(cell)

    return result
4b9b3361

Ответ 1

Я бы использовал генератор:

def group(seq, sep):
    g = []
    for el in seq:
        if el == sep:
            yield g
            g = []
        g.append(el)
    yield g

ex = ['A', 'WORD', 'B' , 'C' , 'WORD' , 'D']
result = list(group(ex, 'WORD'))
print(result)

Отпечатает

[['A'], ['WORD', 'B', 'C'], ['WORD', 'D']]

Код принимает любой итерабельный и создает итерабельность (которую вам не нужно сглаживать в список, если вы этого не хотите).

Ответ 2

import itertools

lst = ['A', 'WORD', 'B' , 'C' , 'WORD' , 'D']
w = 'WORD'

spl = [list(y) for x, y in itertools.groupby(lst, lambda z: z == w) if not x]

это создает разделенный список без разделителей, который выглядит более логичным для меня:

[['A'], ['B', 'C'], ['D']]

Если вы настаиваете на включении разделителей, это должно сделать трюк:

spl = [[]]
for x, y in itertools.groupby(lst, lambda z: z == w):
    if x: spl.append([])
    spl[-1].extend(y)

Ответ 3

Решение

@NPE выглядит очень pythonic для меня. Это еще один, используя itertools:

from itertools import izip, chain
example = ['A', 'WORD', 'B' , 'C' , 'WORD' , 'D']
indices = [i for i,x in enumerate(example) if x=="WORD"]
pairs = izip(chain([0], indices), chain(indices, [None]))
result = [example[i:j] for i, j in pairs]

Этот код в основном основан на этом ответе.