2015-01-20 3 views
3

Эта проблема наиболее легко проиллюстрирована в псевдокоде. У меня есть список, как это:Разделить список строк в список подписок на основе строки

linelist = ["a", "b", "", "c", "d", "e", "", "a"] 

Я хотел бы получить его в формате:

questionchunks = [["a", "b"], ["c", "d", "e"], ["a"]] 

Моя первая попытка это:

questionchunks = [] 
qlist = [] 

for line in linelist: 

    if (line != "" and len(qlist) != 0): 
     questionchunks.append(qlist) 
     qlist = [] 
    else: 
     qlist.append(line) 

Мой выход немного перепутались хотя. Я был бы благодарен за любые указатели, которые я могу получить.

+0

некоторые из ответов полагаться на содержание массива, являющихся смежными, Я подозреваю, что это не так в вашем реальном случае использования? – stevejpurves

+0

@stevejpurves - Содержимое массива всегда будет смежным, поскольку они будут иметь группы непустых строк, разделенных пустыми строками. – iCodez

ответ

7

Вы почти рядом с вашей цели, это минимальное редактирование требуется

linelist = ["a", "b", "", "c", "d", "e", "", "a"] 
questionchunks = [] 
qlist = [] 
linelist.append('') # append an empty str at the end to avoid the other condn 
for line in linelist: 

    if (line != ""): 
     questionchunks.append(line)  # add the element to each of your chunk 
    else: 
     qlist.append(questionchunks) # append chunk 
     questionchunks = []  # reset chunk 

print qlist 
+0

Я не уверен, какой OP желаемый результат для чего-то типа: '[" "," a "," b "," "," c "," d "," e "," "," a "," ] ', но это решение добавит пустые списки для этого примера. –

+0

@AshwiniChaudhary Спасибо за эту информацию. Он добавляет пустые списки, но не легко ли их удалить в одной строке? еще раз спасибо –

6

Это можно легко сделать с помощью itertools.groupby:

>>> from itertools import groupby 
>>> linelist = ["a", "b", "", "c", "d", "e", "", "a"] 
>>> split_at = "" 
>>> [list(g) for k, g in groupby(linelist, lambda x: x != split_at) if k] 
[['a', 'b'], ['c', 'd', 'e'], ['a']] 
Смежные вопросы