26

我有一个包含各种字符串值的列表。每当我看到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

4 回答 4

37
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)
于 2013-03-12T10:14:18.407 回答
21

我会使用生成器:

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

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

于 2013-03-12T09:54:01.617 回答
3
  • @NPE 的解决方案对我来说看起来很 Pythonic。这是另一个使用itertools
  • izip特定于 python 2.7。替换izipzip在 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]
于 2013-03-12T10:03:13.620 回答
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

于 2018-07-14T00:06:36.583 回答