在Python中分割列表

4 投票
2 回答
1012 浏览
提问于 2025-04-17 18:30

我有一个对象的列表,现在我想把它变成一个列表的列表,用另一个列表里的对象来分割,像这样:

l = ['x',1,2,3,'a',5,6,1,7]

还有另一个对象的列表

s = ['a', 1, 4]

我希望得到的结果是这样的:

[ ['x'], [1, 2, 3], ['a', 5, 6], [1, 7] ]

有没有什么好用的、符合Python风格的方法来实现这个呢?

补充说明:

我希望每个结果列表的开头是列表中的一个元素,并且这些列表要保持初始列表中的元素顺序不变。

2 个回答

5

生成器可以很快帮你做到这一点:

def split_on_members(seq, s):
    s = set(s)
    chunk = []
    for i in seq:
        if i in s and chunk:
            yield chunk
            chunk = []
        chunk.append(i)
    if chunk:
        yield chunk

这会得到:

>>> list(split_on_members(l, s))
[['x'], [1, 2, 3], ['a', 5, 6], [1, 7]]

当然,你可以直接遍历生成器,而不需要先创建一个完整的列表:

>>> for group in split_on_members(l, s):
...     print group
... 
['x']
[1, 2, 3]
['a', 5, 6]
[1, 7]
2

试试这两个函数,

  1. 第一个是“返回”类型

    def overlap_split_list(l,s):
        l1 = []
        l2 = []
        for i in l:
            if i in s:
                l1.append(l2)
                l2 = []
            l2.append(i)
        if l2: l1.append(l2)
        return l1
    
  2. 第二个是生成器类型

    def generator_overlap_split_list(l,s):
        l2 = []
        for i in l:
            if i in s:
                yield l2
                l2 = []
            l2.append(i)
        if l2: yield l2
    

输出结果(都是一样的)

print overlap_split_list(l,s)    
print [i for i in generator_overlap_split_list(l,s)]
print list(generator_overlap_split_list(l,s))

撰写回答