2013-03-12 74 views
11

Tôi có danh sách chứa các giá trị chuỗi khác nhau. Tôi muốn chia nhỏ danh sách bất cứ khi nào tôi thấy WORD. Kết quả sẽ là danh sách các danh sách (sẽ là danh sách con của danh sách gốc) chứa chính xác một thể hiện của WORD Tôi có thể làm điều này bằng cách sử dụng vòng lặp nhưng có thêm thêm pythonic cách nào để đạt được điều này không?Python tách danh sách dựa trên từ phân tách

Ví dụ = ['A', 'WORD', 'B' , 'C' , 'WORD' , 'D']

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

Đây là những gì tôi đã cố gắng nhưng nó thực sự không đạt được những gì tôi muốn vì nó sẽ đưa WORD trong một danh sách khác nhau mà nó phải ở trong:

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 

Trả lời

10

tôi sẽ sử dụng một máy phát điện:

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) 

này in

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

Mã này chấp nhận bất kỳ iterable, và tạo ra một iterable (mà bạn không để san bằng vào một danh sách nếu bạn không muốn).

1

@ Giải pháp của NPE có vẻ rất thiên về tôi. Đây là một số khác sử dụng 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] 

Mã này chủ yếu dựa trên this answer.

+0

Cảm ơn tôi cũng đã cố gắng chia nhỏ dựa trên các chỉ mục nhưng không chắc chắn cách ghép nối chúng. Đây là một cách rất hay. – 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] 

điều này tạo ra một danh sách tách mà không delimiters, trông hợp lý hơn với tôi:

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

Nếu bạn nhấn mạnh vào delimiters để được bao gồm, điều này sẽ làm các trick:

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

Đây là một sử dụng tuyệt vời của 'itertools'. –

+1

Rất khuyến khích sử dụng câu trả lời này vì nó có nhiều pythonic với mô đun 'itertools' được dựng sẵn! – Drake

+0

Thật không may, phiên bản thứ hai cho kết quả không đúng nếu xác định được lặp lại. –

Các vấn đề liên quan