根据分隔符拆分列表
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_at
和 split_after
。
【讨论】:
【参考方案4】: @NPE 的解决方案在我看来非常 Pythonic。这是另一个使用itertools
:
izip
特定于 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。
【讨论】:
谢谢 我也尝试根据索引进行拆分,但不确定如何将它们配对。这是一个非常好的方法。以上是关于根据分隔符拆分列表的主要内容,如果未能解决你的问题,请参考以下文章