按值拆分列表并保留分隔符

Sci*_*tas 8 python

我有一个名为的列表list_of_strings,如下所示:

['a', 'b', 'c', 'a', 'd', 'c', 'e']
Run Code Online (Sandbox Code Playgroud)

我想按一个值(在本例中为c)拆分此列表。我也想保留c由此产生的分裂。

所以预期的结果是:

[['a', 'b', 'c'], ['a', 'd', 'c'], ['e']]]
Run Code Online (Sandbox Code Playgroud)

有什么简单的方法可以做到这一点?

pyl*_*ang 6

您可以使用more_itertoools简单明了地完成此操作:

from more_itertools import split_after


lst = ["a", "b", "c", "a", "d", "c", "e"]
list(split_after(lst, lambda x: x == "c"))
# [['a', 'b', 'c'], ['a', 'd', 'c'], ['e']]
Run Code Online (Sandbox Code Playgroud)

另一个例子,这里我们通过简单地改变谓词来拆分单词:

lst = ["ant", "bat", "cat", "asp", "dog", "carp", "eel"]
list(split_after(lst, lambda x: x.startswith("c")))
# [['ant', 'bat', 'cat'], ['asp', 'dog', 'carp'], ['eel']]
Run Code Online (Sandbox Code Playgroud)


j4n*_*4nw 6

stuff = ['a', 'b', 'c', 'a', 'd', 'c', 'e']
Run Code Online (Sandbox Code Playgroud)

您可以像这样找到索引'c',然后添加 1,因为您将在它之后而不是在其索引处进行拆分:

indices = [i + 1 for i, x in enumerate(stuff) if x == 'c']
Run Code Online (Sandbox Code Playgroud)

然后像这样提取切片:

split_stuff = [stuff[i:j] for i, j in zip([0] + indices, indices + [None])]
Run Code Online (Sandbox Code Playgroud)

zip您提供类似于 的元组列表(indices[i], indices[i + 1]),连接[0]允许您提取第一部分并[None]提取最后一个切片 ( stuff[i:])