2013-03-12 24 views
11

我有一个包含各种字符串值的列表。每当我看到WORD时,我想分割列表。结果将是列表(这将是原始列表的子列表),其中包含WORD的一个实例,我可以使用循环做到这一点,但有没有更pythonic方法来做到这一点?Python基于分隔符词划分列表

示例= ['A', 'WORD', 'B' , 'C' , 'WORD' , 'D']

结果= [['A'], ['WORD','B','C'],['WORD','D']]

这是我试过,但它实际上并没有达到我想要的,因为它会把WORD在不同的列表,它应该是:

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 

回答

10

我会用发电机:

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) 

这将打印

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

代码接受任何可迭代,并产生一个可迭代(你不拼合到一个列表,如果你不希望)。

1

@ NPE的解决方案对我来说看起来很pythonic。这是另外一个使用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] 

该代码主要是基于this answer

+0

谢谢我也试图根据指数进行分割,但不知道如何配对。这是一个非常好的方法。 – Cemre 2013-03-12 11:00:24

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] 

这将创建无定界符分裂名单,这看起来更合乎逻辑的对我说:

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

如果你坚持的分隔符被包括在内,这应该做的伎俩:

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

这是'itertools'的一个很好的用法。 – 2016-04-19 10:33:00

+1

强烈建议使用这个答案,因为它与内建的'itertools'模块有很多pythonic! – Drake 2016-10-10 08:01:38

+0

不幸的是,如果重复了分隔符,第二个版本会给出错误的结果。 – 2017-10-08 12:18:19