基于分隔词将列表拆分

30

我有一个包含多个字符串值的列表。每当我看到 WORD 时,我想将列表拆分。结果将是一个列表的列表(原始列表的子列表),其中包含恰好一个 WORD 实例。我可以使用循环来实现这一点,但是否有更加 Pythonic 的方法来实现此目的?

示例 = ['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
4个回答

41
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模块,更符合Pythonic风格! - Drake Guan
1
不幸的是,如果分隔符重复,第二个版本会给出错误的结果。 - Ilya V. Schurov
AttributeError: 'list'对象没有'groupby'属性。 - Deepa MG

23

我会使用生成器:

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
请注意,如果您想从结果中排除分隔符,则可以在group函数的if语句内添加continue语句。 - tjysdsg
请注意,如果排除停用词,则在输入的结尾处出现停用词将导致返回一个空列表。 - norok2

4
  • @NPE的解决方案对我来说看起来非常pythonic。这是另一种使用itertools的方法:
  • izip仅适用于Python 2.7。在Python 3中,请使用zip替换izip
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]

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

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']]
< p > more_itertools是一个第三方库,可通过> pip install more_itertools进行安装。

另请参阅split_atsplit_after


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接