2016-02-28 9 views
6

Ho una lista di stringhe s come segue:Python: Elenco contenente elenco secondario di stringhe

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

Voglio questa lista per essere suddiviso in sottoliste. Ogni volta che c'è un ?!.\n un nuovo elenco secondario è formato come segue:

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

ho provato questo:

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

negozi finali la mia uscita. Non ottenere il modo in cui dovrebbe essere. Eventuali suggerimenti?

risposta

1

È possibile utilizzare il seguente:

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) 

uscita

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

Questo utilizza una lista di comprensione con il costruito nel enumerate funzione per estrarre il idxes di s in cui si verifica un segno di punteggiatura. Quindi utilizza un'altra comprensione di lista per costruire una lista di sottoliste tagliando lo s usando i valori di 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

Tu non eri poi così lontano:

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

Solo un po 'di problemi di indicizzazione e fare una lista finale per raccogliere tutti liste parziali.

+0

vi consiglio l'uso di 'enumerate' per ottenere l'indice, invece, e, in generale, è meglio usare un' set' per il test di adesione a causa della sua costante di tempo contro la ricerca lineare tuple o lista – Copperfield

+0

@Copperfield: infatti 'enumerate' è più bello per l'indicizzazione, ma cambierebbe lo stru cture del codice. Volevo stare il più vicino possibile alla struttura originale. – mkiever

0

1 Let è un array vuoto.

2 While loop è vero quando non è vuoto e indice < len (s).

3 accodamento per allineamento finale con 0 a + 1 postazione di parole

4 compattare i principale stringa s.

5 incr il valore dell'indice

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

Io non sono davvero spesso usare python, ma nel tuo caso credo che si può anche provare a creare un generatore da voi elenco iniziale, in modo da non avere alla lista del deposito delle liste:

>>> 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', '.']]