在python中拆分列表

时间:2013-03-09 14:55:22

标签: python

我有一个对象列表,我希望得到一个对象列表列表,使用另一个列表中的对象进行拆分,如下所示:

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

和另一个对象列表

s = ['a', 1, 4]

我希望得到结果:

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

有没有好的/ pythonic方式呢?

编辑:

我希望每个结果列表的头部都是s的元素,并且所有这些列表都保持初始列表的元素的顺序相同。

2 个答案:

答案 0 :(得分: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]

答案 1 :(得分:2)

尝试这两个功能,

  1. 'return'类型

    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
    
  3. 输出(全部相同)

    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))