(Python 3)使用唯一元素作为分隔符拆分列表

时间:2018-11-07 01:22:53

标签: python python-3.x list slice

我有一个列表l=[2,3,4,5,6,99,7,8,9,10,11,12,100,13,14,15,16,17,18,101],我想将l分成子列表[2,3,4,5,6], [7,8,9,10,11,12],[13,14,15,16,17,18],这意味着我将属于separators = [99,100,101]的'分隔符'数字99,100,101用作标记,指示我应该转到下一个列表的位置。

尤其是,这些子列表可能不具有相同数量的元素,但是大小仅1(5或6)不同。注意:分隔符可能超过3个。

在Python 3中是否有一种有效的方法?我想到先提取分隔符元素的索引,然后相应地对列表进行切片,但似乎过于复杂且计算量很大。

一些见识会很棒!

添加(来自@Netwave的建议):我的尝试(显然不起作用):

g = []
for i in l:
    if i in separators:
        g += [l[:l.index(i)]]

输出:

>>> g
[[2, 3, 4, 5, 6], [2, 3, 4, 5, 6, 99, 7, 8, 9, 10, 11, 12], [2, 3, 4, 5, 6, 99, 7, 8, 9, 10, 11, 12, 100, 13, 14, 15, 16, 17, 18]]

3 个答案:

答案 0 :(得分:4)

使用groupby

from itertools import groupby

separators = [99, 100, 101]
l = [2, 3, 4, 5, 6, 99, 7, 8, 9, 10, 11, 12, 100, 13, 14, 15, 16, 17, 18, 101]

splits = [list(values) for key, values in groupby(l, key=lambda x: x not in separators) if key]

print(splits)

输出

[[2, 3, 4, 5, 6], [7, 8, 9, 10, 11, 12], [13, 14, 15, 16, 17, 18]]

答案 1 :(得分:2)

我希望您正在寻找类似于以下代码的内容。您需要遍历列表,并继续检查分隔符列表中是否存在该元素。正如您所说,可以通过在分隔符列表上进行迭代并在主列表中找到元素的索引来完成此操作。为了简单起见,我采用了前一种方法。 (注意使用endindex变量):

l=[2,3,4,5,6,99,7,8,9,10,11,12,100,13,14,15,16,17,18,101]
seperator = [99,100,101]

list_of_list = []
endindex = 0
for i in range(0,len(l),1):
    if l[i] in seperator:
        list_of_list.append(l[endindex:i])
        endindex = i + 1

print(list_of_list)

输出:

[[2, 3, 4, 5, 6], [7, 8, 9, 10, 11, 12], [13, 14, 15, 16, 17, 18]]

答案 2 :(得分:1)

更易于在函数中使用:

import itertools
def split(l,l2):
    return [list(v) for k,v in itertools.groupby(l,lambda x: x in l2) if not k]
l = [2, 3, 4, 5, 6, 99, 7, 8, 9, 10, 11, 12, 100, 13, 14, 15, 16, 17, 18, 101]
print(split(l,[99, 100, 101]))

输出:

[[2, 3, 4, 5, 6], [7, 8, 9, 10, 11, 12], [13, 14, 15, 16, 17, 18]]

实现了Split a list into nested lists on a value

的副本