在python中使用分隔符列表将列表拆分为子列表
我想使用列表的子列表作为分隔符将列表拆分为子列表。子列表中的元素必须充当创建列表的起点,直到子列表中的下一个元素出现在列表中 最好用一个例子来说明:在python中使用分隔符列表将列表拆分为子列表,python,list,Python,List,我想使用列表的子列表作为分隔符将列表拆分为子列表。子列表中的元素必须充当创建列表的起点,直到子列表中的下一个元素出现在列表中 最好用一个例子来说明: lst = ['a','b','c','d','1','11','111','x','y','z'] sep = ['b','11','y'] 这是我想要的输出: [['b','c','d','1'],['11','111','x'],['y','z']] 到目前为止,我有以下几点: import itertools [list(x[1])
lst = ['a','b','c','d','1','11','111','x','y','z']
sep = ['b','11','y']
这是我想要的输出:
[['b','c','d','1'],['11','111','x'],['y','z']]
到目前为止,我有以下几点:
import itertools
[list(x[1]) for x in itertools.groupby(lst, lambda x: x in sep)]
但是这就产生了
['a'],['b'],['c','d','1'],['11'],['111','x'],['y'],['z']]
,这不是我想要的。带有显式循环的解决方案
这是基于这样的假设:分隔符是无序的——事实上,无论您是否多次使用同一分隔符,都无关紧要——只要lst
中的元素与任何分隔符匹配,它就会启动一个新列表
lst = ['a','b','c','d','1','11','111','x','y','z']
sep = ['b','11','y']
out = []
for el in lst:
if el in sep:
out.append([])
if out:
out[-1].append(el)
print(out)
根据元素的数量,可能需要从sep
创建一个集合,以便更有效地进行包含测试。假设:
- 分隔符不重复
- 分隔符在
和lst
中的顺序相同sep
None
作为最后一段的结尾:
starts = sorted(lst.index(s) for s in sep)
ends = starts[1:] + [None]
从每个起始位置到匹配的结束位置取原始列表的一部分:
[lst[slice(start, end)] for start, end in zip(starts, ends)]
#[['b', 'c', 'd', '1'], ['11', '111', 'x'], ['y', 'z']]
后者可使用星号符号书写:
[lst[slice(*ends)] for ends in zip(starts, ends)]
#[['b', 'c', 'd', '1'], ['11', '111', 'x'], ['y', 'z']]
以下是如何使用切片:
lst = ['a','b','c','d','1','11','111','x','y','z']
sep = ['b','11','y']
l = [lst.index(i) for i in sep]+[len(lst)]
l = [lst[l[i-1]:v] for i,v in enumerate(l)][1:]
print(l)
输出:
[['b', 'c', 'd', '1'], ['11', '111', 'x'], ['y', 'z']]
您想要的输出中是否有一个
'a'
?是否所有分隔符都存在于lst
中?您是否尝试过手动执行此操作<代码>输出=[];对于lst中的x:if x in sep:out.append(something).分隔符可以出现多次吗?@wjandrea谢谢,已经完成-假设已声明。我认为如果分隔符重复出现,此操作将失败。像lst=['a','b','c','d','1','11','111','x','y','z','a','b','c']sep=['b','11','y','b']@WilfRosenbaum如果重复使用一个分隔符,那么对于输出应该是什么可能有多种解释。OP没有说明,很好。我想知道从概念上讲,如果+[None]
从开始中省略了+[None]
,那么你是否更容易理解,但是你有结束=开始[1::+[None]
。事实上,我打算编辑它来做到这一点-如果你不同意,显然可以回滚。对不起,我删除了我的评论,因为我又改变了主意——或者至少我不确定——但显然太晚了。。。我要请OP澄清一下。分隔符确实是订购的,但每个分隔符最多出现一次。所以你的解决方案仍然有效。谢谢!