Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在python中使用分隔符列表将列表拆分为子列表_Python_List - Fatal编程技术网

在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澄清一下。分隔符确实是订购的,但每个分隔符最多出现一次。所以你的解决方案仍然有效。谢谢!