根据分隔符拆分列表

Posted

技术标签:

【中文标题】根据分隔符拆分列表【英文标题】:Splitting a list based on a delimiter word 【发布时间】:2013-02-27 18:22:21 【问题描述】:

我有一个包含各种字符串值的列表。每当我看到WORD 时,我都想拆分列表。结果将是一个列表列表(将是原始列表的子列表),其中包含 WORD 的一个实例实现这个?

示例 = ['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

【问题讨论】:

【参考方案1】:
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)

【讨论】:

强烈建议使用这个答案,因为它与内置的itertools 模块非常相似! 不幸的是,如果重复分隔符,第二个版本会给出不正确的结果。 AttributeError: 'list' 对象没有属性 'groupby'【参考方案2】:

我会使用生成器:

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

代码接受任何可迭代对象,并生成一个可迭代对象(如果您不想这样做,则必须将其展平为列表)。

【讨论】:

注意,如果你想从结果中排除分隔符,你可以在group函数的if语句中添加continue语句。 请注意,如果您排除停用词,如果停用词位于输入的末尾,您将生成一个空列表【参考方案3】:

给定

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

【讨论】:

【参考方案4】: @NPE 的解决方案在我看来非常 Pythonic。这是另一个使用itertoolsizip 特定于 python 2.7。将 izip 替换为 zip 以在 python 3 中工作
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。

【讨论】:

谢谢 我也尝试根据索引进行拆分,但不确定如何将它们配对。这是一个非常好的方法。

以上是关于根据分隔符拆分列表的主要内容,如果未能解决你的问题,请参考以下文章

在许多分隔符之后拆分列表元素

Python:按分隔符列表拆分字符串

根据多个分隔符拆分字符串

使用单词列表作为分隔符的 C++ 拆分字符串

XSLT - 如何根据分隔符拆分每个元素

读取 df,拆分每个单元格并附加到列表