在Python中分割列表列表

在Python中分割列表列表,python,Python,我有一个相同长度的列表。我想将第一个列表分段为给定值的连续运行。然后,我将对剩余列表进行分段,以匹配从第一个列表生成的分段 例如: Given value: 2 Given list of lists: [[0,0,2,2,2,1,1,1,2,3], [1,2,3,4,5,6,7,8,9,10], [1,1,1,1,1,1,1,1,1,1] Return: [ [[2,2,2],[2]], [[3,4,5],[9]], [[1,1,1],[1]] ] 我得到的最接近的指数是: >&g

我有一个相同长度的列表。我想将第一个列表分段为给定值的连续运行。然后,我将对剩余列表进行分段,以匹配从第一个列表生成的分段

例如:

Given value: 2

Given list of lists: [[0,0,2,2,2,1,1,1,2,3], [1,2,3,4,5,6,7,8,9,10], [1,1,1,1,1,1,1,1,1,1]

Return: [ [[2,2,2],[2]], [[3,4,5],[9]], [[1,1,1],[1]] ]
我得到的最接近的指数是:

>>> import itertools
>>> import operator
>>> x = 2
>>> L = [[0,0,2,2,2,1,1,1,2,3],[1,2,3,4,5,6,7,8,9,10],[1,1,1,1,1,1,1,1,1,1]]
>>> I = [[i for i,value in it] for key,it in itertools.groupby(enumerate(L[0]), key=operator.itemgetter(1)) if key == x]
>>> print I
[[2, 3, 4], [8]]
此代码是根据此站点上的另一个问题修改的

我想找到最有效的方法,因为这些清单可能很长

编辑:

如果我把这些列表一个一个地放在另一个上面,可能会更清楚:

[[0,0,[2,2,2],1,1,1,[2],3], -> [2,2,2],[2]
 [1,2,[3,4,5],6,7,8,[9],10],-> [3,4,5],[9]
 [1,1,[1,1,1],1,1,1,[1],1]] -> [1,1,1],[1]

这似乎是一种方法,它首先创建传染元素的字典,然后在每个列表中查找该键并存储在输出中

您可以使用
groupby
以组的起始索引和长度元组的形式创建组列表,并使用此列表从每个子列表中提取值:

from itertools import groupby
from operator import itemgetter

def match(L, x):
    groups = [(next(g)[0], sum(1 for _ in g) + 1)
        for k, g in groupby(enumerate(L[0]), key=itemgetter(1)) if k == x]
    return [[lst[i: i + length] for i, length in groups] for lst in L]
以便:

match([[0,0,2,2,2,1,1,1,2,3], [1,2,3,4,5,6,7,8,9,10], [1,1,1,1,1,1,1,1,1,1]], 2)
返回:

[[[2, 2, 2], [2]], [[3, 4, 5], [9]], [[1, 1, 1], [1]]]

不清楚您是如何获得预期输出的。请您解释一下您是如何获得预期输出的。@PrashantKumar将第一个列表分成连续运行的段,值为2。在第一个列表中查找这些元素的索引。从这些索引的其他列表中获取值,按照与第一个列表中的段相同的方式进行分组。我必须遍历它。老实说,这比我希望的要复杂一点。抱歉。实际上,它比以前的版本更容易理解,只是我从头开始实现了所有东西,所以代码看起来更大。
[[[2, 2, 2], [2]], [[3, 4, 5], [9]], [[1, 1, 1], [1]]]