Python基于分隔符单词拆分列表

时间:2013-03-12 09:45:52

标签: python list split

我有一个包含各种字符串值的列表。我希望在看到WORD时拆分列表。结果将是一个列表列表(将是原始列表的子列表),其中只包含WORD的一个实例我可以使用循环执行此操作但是有一个更多pythonic 方式要做到这一点吗?

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

result = [['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

4 个答案:

答案 0 :(得分:19)

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 :(得分:11)

我会使用发电机:

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

代码接受任何可迭代的,并产生一个可迭代的(如果你不想,你不会 将其展平成一个列表)。

答案 2 :(得分: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

答案 3 :(得分:0)

给出

import more_itertools as mit


iterable = ["A", "WORD", "B" , "C" , "WORD" , "D"]
pred = lambda x: x == "WORD"

代码

list(mit.split_before(iterable, pred))
# [['A'], ['WORD', 'B', 'C'], ['WORD', 'D']]

more_itertools是可通过> pip install more_itertools安装的第三方库。

另请参阅split_atsplit_after