2013-03-12 1 views
11

Ho una lista contenente vari valori di stringa. Voglio dividere l'elenco ogni volta che vedo WORD. Il risultato sarà una lista di liste (che saranno le sottoliste della lista originale) contenenti esattamente un'istanza di WORD Posso farlo utilizzando un ciclo ma esiste un più coronario modo per fare questo?Python che divide un elenco basato su una parola delimitatore

Esempio = ['A', 'WORD', 'B' , 'C' , 'WORD' , 'D']

risultato = [['A'], ['WORD','B','C'],['WORD','D']]

Questo è quello che ho provato, ma in realtà non ottiene quello che voglio in quanto sarà messo WORD in un elenco diverso che dovrebbe essere in:

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 

risposta

10

vorrei usare un generatore:

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) 

Questo stampa

[['A'], ['WORD', 'B', 'C'], ['WORD', 'D']] 

Il codice accetta qualsiasi iterabile, e produce un iterabile (che non lo fai hanno ad appiattirsi in una lista se non si vuole).

1

@ La soluzione di NPE mi sembra molto pitonica. Questo è un altro utilizza 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] 

Questo codice si basa principalmente su this answer.

+0

Grazie anche io ho tentato di dividere in base agli indici ma non ero sicuro di come abbinarli. Questo è un modo molto carino. – Cemre

10
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] 

questo crea una lista a spacco, senza delimitatori, che sembra più logico per me:

[['A'], ['B', 'C'], ['D']] 

Se ti ostini a delimitatori da inserire, questo dovrebbe fare il trucco:

spl = [[]] 
for x, y in itertools.groupby(lst, lambda z: z == w): 
    if x: spl.append([]) 
    spl[-1].extend(y) 
+1

Questo è un ottimo uso di 'itertools'. –

+1

Suggerisco caldamente di usare questa risposta in quanto è molto pitonica con il modulo integrato itertools'! – Drake

+0

Sfortunatamente, la seconda versione fornisce risultati errati se il delimitatore viene ripetuto. –