2016-02-28 6 views
6

У меня есть список строк s следующим образом:Python: Список, содержащий подсписок строк

s = ['Hello', 'world', '!', 'How', 'are', 'you', '?', 'Have', 'a', 'good', 'day', '.'] 

Я хочу этот список должен быть разбит на подсписков. Всякий раз, когда есть ?!.\n новый Подсписок формируются следующим образом:

final = [['Hello', 'world', '!'], 
     ['How', 'are', 'you', '?'], 
     ['Have', 'a', 'good', 'day', '.']] 

Я попытался это:

x = 0 
for i in range(len(s)): 
    if s[i] in ('!','?','.','\n'): 
     final = s[x: x+i] 
    x = i+1 

конечных магазины моего выхода. Не так, как должно быть. Какие-либо предложения?

ответ

1

Вы можете использовать следующее:

s = ['Hello', 'world', '!', 'How', 'are', 'you', '?', 'Have', 'a', 'good', 'day', '.'] 
letters = ['!', '?', '.'] 

idxes = [idx for idx, val in enumerate(s) if val in letters] 
idxes = [-1] + idxes 
answer = [s[idxes[i]+1:idxes[i+1]+1] for i in range(len(idxes[:-1]))] 
print(answer) 

Выход

[['Hello', 'world', '!'], ['How', 'are', 'you', '?'], ['Have', 'a', 'good', 'day', '.']] 

Это использует список понимание с помощью встроенного в enumerate функции для извлечения idxes из s где происходит знак препинания. Затем он использует другое понимание списка, чтобы построить список подписок, нарезая s, используя значения idxes.

1
s = ['Hello', 'world', '!', 'How', 'are', 'you', '?', 'Have', 'a', 'good', 'day', '.'] 
final = [] 
b = [] 
for x in s: 
    b.append(x) 
    if x in ('.', '?', '!', '\n'): 
     final.append(b) 
     b = [] 
2

Вы не были так далеко:

x=0 
final=[] 
for i in range(len(s)): 
    if s[i] in ('!','?','.','\n'): 
     final.append(s[x:i+1]) 
     x=i+1 

только немного проблемы индексации и сделать окончательный список, чтобы собрать все частичные списки.

+0

Я рекомендую использовать 'enumerate', чтобы получить индекс вместо этого, и в целом лучше использовать' set' для тестирования членства из-за его постоянная время против линейного поиска в кортежи или список – Copperfield

+0

@Copperfield: Действительно, 'enumerate' лучше для индексирования, но изменит структуру cture кода. Я хотел оставаться как можно ближе к первоначальной структуре. – mkiever

0

1 Пусть final - пустой массив.

2 Хотя цикл является истинным, когда не пуст, и индекс < len (s).

3 Append до конечного массива с 0 до постион + 1 слов

4 термоусадочные вашей основной строки с.

5 прирастить значение индекса

final = [] 
i =0 
while len(s) and i<len(s): 
    if s[i] in ('!','?','.','\n'): 
     final.append(s[:i+1]) 
     s = s[i+1:] 
    i +=1 
print(final) 
0

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

>>> from itertools import chain 
>>> def func(s): 
...  g = iter(s) 
...  def inner_func(g): 
...   for x in g: 
...    yield x 
...    if x in ('.', '?', '!', '\n'): 
...     break 
...  while True: 
...   try: 
...    f = g.next() 
...   except StopIteration: 
...    break 
...   else: 
...    yield inner_func(chain([f], g)) 
>>> [[y for y in x] for x in func(s)] 
[['Hello', 'world', '!'], ['How', 'are', 'you', '?'], ['Have', 'a', 'good', 'day', '.']]