itertools groupby + repeat + chain
Это одно решение с использованием модуля itertools
.По сути, это единственные операции, которые нам нужно выполнить:
- Группировать элементов в зависимости от того, начинаются ли они с
\xa0
. - Повтор заголовки для каждого списка в вашем списке списков после группировки.
- Цепочка результаты для серий
A
и B
для удаления вложенных списков.
Важно отметить, что эти операции уже реализованы в стандартной библиотеке лениво и эффективно, поэтому нет необходимости воспроизводить их на чистом Python (хотя само по себе это хорошее упражнение для обучения).
Полное решение:
from itertools import chain, groupby, repeat
chainer = chain.from_iterable
data = ['\xa0header1', 'element1', 'element2', 'element3',
'\xa0header2', 'element4', 'element5']
def condition(x):
return x.startswith('\xa0')
# create list of lists for elements
elements = [list(j) for i, j in groupby(data, key=condition) if not i]
# create list of headers
headers = [next(j) for i, j in groupby(data, key=condition) if i]
# chain list of lists, and use repeat for headers
df = pd.DataFrame({'A': list(chainer(LoL)),
'B': list(chainer(repeat(i, j) for i, j in \
zip(headers, map(len, elements))))})
print(df)
A B
0 element1 header1
1 element2 header1
2 element3 header1
3 element4 header2
4 element5 header2