Python 基于分隔符字拆分列表

Python 基于分隔符字拆分列表,python,list,split,Python,List,Split,我有一个包含各种字符串值的列表。每当我看到WORD时,我都想拆分列表。结果将是一个列表列表(将是原始列表的子列表),其中正好包含一个单词的实例,我可以使用循环来实现这一点,但有没有更具python风格的方法来实现这一点 示例=['A','WORD','B','C','WORD','D'] 结果=['A']、['WORD'、'B'、'C']、['WORD'、'D']. 这是我尝试过的,但实际上并没有达到我想要的效果,因为它会将WORD放在一个不同的列表中,它应该在其中: def split_exc

我有一个包含各种字符串值的列表。每当我看到
WORD
时,我都想拆分列表。结果将是一个列表列表(将是原始列表的子列表),其中正好包含一个
单词的实例
,我可以使用循环来实现这一点,但有没有更具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

我会使用发电机:

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']]
代码接受任何iterable,并生成一个iterable(如果不想,您不必将其展平到列表中)。

  • @NPE的解决方案在我看来很像蟒蛇。这是另一个使用
    itertools
  • izip
    特定于python 2.7。将
    izip
    替换为
    zip
    以在python 3中工作
从itertools导入izip,链
示例=['A','WORD','B','C','WORD','D']
索引=[i代表i,x在枚举(示例)中,如果x==“WORD”]
pairs=izip(链([0],索引),链(索引,[None]))
结果=[成对i,j的示例[i:j]
  • 此代码主要基于
这将创建一个不带分隔符的拆分列表,在我看来更符合逻辑:

[['A'], ['B', 'C'], ['D']]
如果您坚持要包含分隔符,则应该这样做:

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

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']]
第三方库是否可通过
>pip安装更多\u itertools
安装


另请参见和。

谢谢,我也尝试根据指数进行拆分,但不确定如何将它们配对。这是一个非常好的方法。强烈建议使用这个答案,因为它与内置的
itertools
模块非常类似!不幸的是,如果delimeter重复,第二个版本会给出不正确的结果。AttributeError:“list”对象没有属性“groupby”。请注意,如果要从结果中排除分隔符,可以在
group
函数的if语句中添加continue语句。请注意,如果排除停止字,如果停止字位于输入的末尾,则将生成一个空列表
list(mit.split_before(iterable, pred))
# [['A'], ['WORD', 'B', 'C'], ['WORD', 'D']]