为了账号安全,请及时绑定邮箱和手机立即绑定

在 Python 中分割列表列表

在 Python 中分割列表列表

www说 2022-07-19 15:52:26
我有一个长度相同的列表列表。我想将第一个列表分割成给定值的连续运行。然后我想分割剩余的列表以匹配从第一个列表生成的段。例如:Given value: 2Given 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]
查看完整描述

2 回答

?
森栏

TA贡献1810条经验 获得超5个赞

您可以使用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]]]


查看完整回答
反对 回复 2022-07-19
?
杨魅力

TA贡献1811条经验 获得超6个赞

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


temp=l[0]


value=2

dict={}

k=-1

prev=-999

for i in range(0,len(temp)):

    if(temp[i]==value):

        if(prev!=-999 and prev==i-1):

            if(k in dict):

                dict[k].append(i)

            else:

                dict[k]=[i]

        else:

            k+=1

            if(k in dict):

                dict[k].append(i)

            else:

                dict[k]=[i]

        prev=i

output=[]

for i in range(0,len(l)):

    single=l[i]

    final=[]

    for keys in dict: #{0: [2, 3, 4], 1: [8]}

        ans=[]

        desired_indices=dict[keys]

        for j in range(0,len(desired_indices)):

            ans.append(single[desired_indices[j]])

        final.append(ans)

    output.append(final)

print(output) #[[[2, 2, 2], [2]], [[3, 4, 5], [9]], [[1, 1, 1], [1]]]

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


查看完整回答
反对 回复 2022-07-19
  • 2 回答
  • 0 关注
  • 159 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号