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
Ответы
Ответ 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]
Этот код в основном основан на этом ответе.