在Python中如何拆分列表

4

我有一个对象列表,希望通过另一个列表中的对象将其分割成对象列表的列表,如下所示:

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

还有另一个对象列表

s = ['a', 1, 4]

And I wish to get the result so:

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

有没有一种优雅/Pythonic的方式来做到这一点?编辑:我希望每个结果列表的头部都是 s 的一个元素,并且所有这些列表都按照初始列表中的元素顺序保留元素。

1
那么它是随机分割还是第二个列表是切断单个列表的位置?我只是问因为第一个列表中没有4。 - erdekhayser
你想告诉我们你使用了什么逻辑来拆分列表吗? - IcyFlame
你想要的东西。查看这里 - Umair Saleem
s 可以包含任何对象。问题是使用列表 s 中的对象来拆分列表 l。 - alinsoar
1
问题是使用列表l中的对象来拆分列表l。这并没有说明原始问题没有解决的任何问题。例如,除非我漏掉了什么,您的示例没有显示如果在l中连续存在两个对象,则希望发生什么。您希望['a','1']给出[['a','1']]还是[['a'],['1']]? - DSM
修改了原始问题 - alinsoar
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. The 'return' type

    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. The generator type

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

overlap_split_list 实际上是所有提交的函数中最快的。 - Gandaro
@Gandaro 是的,因为它没有受到任何“外部力量”的影响,即在发电机的情况下,存在来自外部的单独呼叫,这需要时间(来进行呼叫)。 - pradyunsg

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接